Class類別 (C++)

更新於 發佈於 閱讀時間約 10 分鐘

使用者自訂的資料型別

  • 類別是一種自定資料型態的定義,其所產生的實際資料稱為物件(Object)
  • 與結構體struct很像,但類別的功能有,資料封裝(Data Encapsulation)、繼承(inheritance)
  1. 類別存取問題
  2. 類別定義
  3. Dafault Constructor(預設建構函式)
  4. Constructs(建構函式)
  5. Copy Constructors(拷貝建構函式)
  6. Copy Assignment Operator(拷貝指定運算子)
  7. Destructs(解構函式)
  8. 範例Code


類別存取問題

  • 類別與結構體不同之一,類別的成員可以使用public、private、protected關鍵字來設定存取權限
  1. public:任何程式均可直接存取,跟struct結構體一樣
  2. private:只能讓同類別本身所定義的函式成員進行存取
  3. protected:類別本身及其衍生類別可對其直接存取,其他部分之程式則不可。

公開程度:public(公開) > protected(不常見) > private(私有)


類別定義

  class 類別名稱

{

private:

私有成員宣告;

public:

公開成員宣告;

};

備註:未設定存取權限,預設為private(私有)

類別定義

類別定義



Dafault Constructor(預設建構函式)

此建構函式沒有輸入任何參數

建立預設建構函式:

  類別名稱( )

{

初始設定;

}
建立預設建構函式

建立預設建構函式

呼叫預設建構函式:

類別名稱 物件的變數名稱;
呼叫預設建構函式

呼叫預設建構函式



Constructs(建構函式)

產生物件(Object)時,其資料成員可經由建構函式來設定初值,而建構函式是一個與類別名稱同名的函式成員一個類別至少一個Constructs(建構函式)

建立建構函式:

  類別名稱(參數列)

{

初始設定;

}
建立建構函式

建立建構函式

呼叫建構函式:

一般:類別名稱 物件的變數名稱(輸入參數);

指標:類別名稱* 物件的指標名稱 = new 類別名稱(輸入參數)
呼叫建構函式

呼叫建構函式



Copy Constructors(拷貝建構函式)

拷貝建構函式接收已存在同類別物件作為參數,為避免傳值法拷貝資料的低效率,一般使用傳參考法;然後為避免資料於拷貝時不小心被更改,通常會將此參數宣告為const。

建立拷貝建構函式:

  類別名稱(const 類別名& 物件參數)

{

資料逐員拷貝,必要時須配置記憶體;

}
建立拷貝建構函式

建立拷貝建構函式

呼叫拷貝建構函式:

呼叫拷貝建構函式

呼叫拷貝建構函式


Copy Assignment Operator(拷貝指定運算子)

以「=」舉例,想使用「=」, 達成object1 = object2。

建立拷貝指定運算子:

  類別名稱& operator=(const 類別名稱&)

{

資料逐員拷貝,必要時需配置記憶體;

回傳物件本身;

}
  • 備註1:當類別成員是配置記憶體的指標時,拷貝的是記憶體位置,而非記憶體內的資料
  • 備註2:object1 = object2被解讀為,object1.operator = (object2)
建立拷貝指定運算子

建立拷貝指定運算子

呼叫拷貝指定運算子:

呼叫拷貝指定運算子

呼叫拷貝指定運算子


Destructs(解構函式)

當物件不再使用時,用來清除記憶體配置,用來釋放在執行建構函式時所配置的動態記憶體

建立解構函式:

  ~類別名稱()

{

delete 有配置記憶體的類別成員;

delete[] 有配置記憶體的類別成員;

}
建立解構函式

建立解構函式


範例Code

  #include <iostream>

using namespace std;

class x{

private:

int a;//數字a

int **b;//二維陣列b

public:

// default constructor(預設建構函式)

x(){}

// constructs(建構函式)

x(int num){

a = num;

b = new int*[a];

for (int i = 0; i < a; i++){

b[i] = new int[a];

}

for (int i = 0; i < a; i++) {

for (int j = 0; j < a; j++){

b[i][j]=i;

}

}

}




// copy constructors(拷貝建構函式)

x(const x& other) {

a = other.a;

b = new int*[a];

for (int i = 0; i < a; i++) {

b[i] = new int[a];

for (int j = 0; j < a; j++) {

b[i][j] = other.b[i][j];

}

}

}




// copy sssignment operator(拷貝指定運算子)

x& operator=(const x& other) {

a = other.a;

b = new int*[a];

for (int i = 0; i < a; i++) {

b[i] = new int[a];

for (int j = 0; j < a; j++) {

b[i][j] = other.b[i][j];

}

}

return *this;

}




// destructs(解構函式)

~x(){

for (int i = 0; i < a; i++) {

delete[] b[i];

}

}




// print()

void print(){

for (int i = 0; i < a; i++) {

for (int j = 0; j < a; j++){

cout << b[i][j] << " ";

}

cout << endl;

}

}

};


int main(){

x matric1;// 創建物件(matric1)呼叫預設建構函式

x matric2(5);// 創建物件(matric2)呼叫建構函式

x matric3(matric2);// 創建物件(matric3)呼叫拷貝建構函式


matric1 = matric2;// 呼叫拷貝指定運算子,等同:matric1.operator=(matric2);


cout<<"第一部分"<<endl;

matric2.print();


cout<<"第二部分"<<endl;

matric3.print();


cout<<"第三部分"<<endl;

matric1.print();


cout<<"第四部分"<<endl;

x* matric4=new x(2);// 創建陣列物件(matric4)

matric4->print();

delete matric4;

}
1/3

1/3

2/3

2/3

3/3

3/3

Output

  第一部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第二部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第三部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第四部分
0 0
1 1
留言
avatar-img
留言分享你的想法!
avatar-img
匿名李的沙龍
6會員
46內容數
這是新手寫給新手的學習程式語言基礎教學筆記,內容會以C++為主
匿名李的沙龍的其他內容
2022/08/25
Python安裝、外部程式包安裝(pip install xxx)、Hello World 【安裝Python】 Visual Studio Code-Download 進入vscode(延伸模組) 安裝中文介面(輸入ch搜尋) 安裝 搜尋命令提示字元 命令提示字元打python 創建檔案
Thumbnail
2022/08/25
Python安裝、外部程式包安裝(pip install xxx)、Hello World 【安裝Python】 Visual Studio Code-Download 進入vscode(延伸模組) 安裝中文介面(輸入ch搜尋) 安裝 搜尋命令提示字元 命令提示字元打python 創建檔案
Thumbnail
2022/08/19
Google、OneDrive、icloud 鑒於最近Google教育版雲端大開殺戒,來統計一下雲端費用。
Thumbnail
2022/08/19
Google、OneDrive、icloud 鑒於最近Google教育版雲端大開殺戒,來統計一下雲端費用。
Thumbnail
2022/04/01
Visual Studio Code Key Bindings
Thumbnail
2022/04/01
Visual Studio Code Key Bindings
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
,先來分享一下封裝是怎麼一回事。 一、封裝(Encapsulation) 封裝就是把一些功能的處理程序或是資料包起來,也對於程式碼做權限的設定做一層保護的機制,這是為了防止程式碼被竄改,所以有了封裝可以保障我們資料的隱密性,甚至封裝也是一種將一些處理程序隱藏起來,讓使用者使用時可以更加單純。 1.什
Thumbnail
,先來分享一下封裝是怎麼一回事。 一、封裝(Encapsulation) 封裝就是把一些功能的處理程序或是資料包起來,也對於程式碼做權限的設定做一層保護的機制,這是為了防止程式碼被竄改,所以有了封裝可以保障我們資料的隱密性,甚至封裝也是一種將一些處理程序隱藏起來,讓使用者使用時可以更加單純。 1.什
Thumbnail
一、存取修飾詞public / private / protected / internal 二、參數修飾詞ref / in / out >>>>>由於我們在寫程式時,會去宣告一些變數、常數相關識別詞,並且在class(類別)中會寫一些事情或動作讓程式去運行,然而這個概念就是去定義對於我們所寫的內容
Thumbnail
一、存取修飾詞public / private / protected / internal 二、參數修飾詞ref / in / out >>>>>由於我們在寫程式時,會去宣告一些變數、常數相關識別詞,並且在class(類別)中會寫一些事情或動作讓程式去運行,然而這個概念就是去定義對於我們所寫的內容
Thumbnail
這次分享資料形態中的資料型別部分,在VC#流程架構介紹中有提到它如同中文有不同的詞性,那C#程式中有哪些型別呢?我們就來看一看。 一、常用的資料型別 當然還有自訂義的型別這就要看怎麼定義了,之後看內容狀況再來提,那麼資料型態是為了要做宣告用途,告訴電腦你的資料是屬於什麼類別的,這樣在做後續資料時程式
Thumbnail
這次分享資料形態中的資料型別部分,在VC#流程架構介紹中有提到它如同中文有不同的詞性,那C#程式中有哪些型別呢?我們就來看一看。 一、常用的資料型別 當然還有自訂義的型別這就要看怎麼定義了,之後看內容狀況再來提,那麼資料型態是為了要做宣告用途,告訴電腦你的資料是屬於什麼類別的,這樣在做後續資料時程式
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
這篇我們來講一下還蠻重要也蠻常用到的一個自定義型別,叫:struct struct是來自於C/C++的結構,目的是把不同資料型態的參數串在一起,成為一個自定義的資料型態,我們也稱它是一個自定義的結構體。
Thumbnail
這篇我們來講一下還蠻重要也蠻常用到的一個自定義型別,叫:struct struct是來自於C/C++的結構,目的是把不同資料型態的參數串在一起,成為一個自定義的資料型態,我們也稱它是一個自定義的結構體。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
Thumbnail
這篇文章主要介紹存取子讀(get)和寫(set)的概述,並且簡單介紹基本的使用方法以及其他程式呼叫範例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News