Class類別 (C++)

2021/10/09閱讀時間約 9 分鐘
使用者自訂的資料型別
  • 類別是一種自定資料型態的定義,其所產生的實際資料稱為物件(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
2/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
為什麼會看到廣告
匿名李
匿名李
C++新手教學正在規畫緩慢更新(圖片、內容增加、程式碼文字)_2023/04/17,文章有錯誤的地方還請留言指正,謝謝各位
留言0
查看全部
發表第一個留言支持創作者!