2

分享

Class類別 (C++)

使用者自訂的資料型別
類別是一種自定資料型態的定義,其所產生的實際資料稱為物件(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關鍵字來設定存取權限
public:任何程式均可直接存取,跟struct結構體一樣
private:只能讓同類別本身所定義的函式成員進行存取
protected:類別本身及其衍生類別可對其直接存取,其他部分之程式則不可。
公開程度:public(公開) > protected(不常見) > private(私有)

類別定義

  

class 類別名稱

{

private:

    私有成員宣告;

public:

    公開成員宣告;

};

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

類別定義

Dafault Constructor(預設建構函式)

此建構函式沒有輸入任何參數
建立預設建構函式:
  

類別名稱( )

{

    初始設定;

}

c語言

建立預設建構函式

呼叫預設建構函式:
  

類別名稱 物件的變數名稱;

c語言

呼叫預設建構函式

Constructs(建構函式)

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

類別名稱(參數列)

{

    初始設定;

}

c語言

建立建構函式

呼叫建構函式:
  

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

指標:類別名稱* 物件的指標名稱 = new 類別名稱(輸入參數)

c語言

呼叫建構函式

Copy Constructors(拷貝建構函式)

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

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

{

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

}

c語言

建立拷貝建構函式

呼叫拷貝建構函式:
c語言

呼叫拷貝建構函式


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

以「=」舉例,想使用「=」, 達成object1 = object2。
建立拷貝指定運算子:
  

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

{

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

    回傳物件本身;

}

備註1:當類別成員是配置記憶體的指標時,拷貝的是記憶體位置,而非記憶體內的資料
備註2:object1 = object2被解讀為,object1.operator = (object2)
c語言

建立拷貝指定運算子

呼叫拷貝指定運算子:
c語言

呼叫拷貝指定運算子


Destructs(解構函式)

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

~類別名稱()

{

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

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

}

c語言

建立解構函式


範例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;

}

c語言

1/3

c語言

2/3

c語言

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語言 
分類:學習

【關鍵字】:新手教學、Leetcode ; 【分類】:學習、理財。(目前C++新手教學第二章內容已完結)。建議或意見可私訊:https://reurl.cc/ze7L9k。文章有錯誤的地方還請留言指正,謝謝各位

評論
上一篇
  • Struct結構體 (C++)
  • 更多文章
    載入中... 沒有更多了