5 3派生類的建構函式和析構函式

2021-09-02 15:28:22 字數 2649 閱讀 2690

派生類建構函式一般形式:

派生類建構函式名(總參數列):積累建構函式名(實際引數列表)

派生類中新增資料成員初始化語句

看下面**例子:

class student                        //基類 

student(){} //預設建構函式

~student(){} //基類析構函式

protected:

int a;

double b;

string c;

};class student1 : public student //宣告共用派生類student1

~student1(){} //派生類析構函式

protected:

int d;

float e;

};

呼叫派生類建構函式還有一種寫法:

public:

student1(int x, double y, string z, int m, float n):student(x, y, z),d(m),e(n)

如果類的資料成員除了標準資料型別外,還包含類物件,這種被包含的物件就叫「子物件」,即物件中的物件

還按剛才的例子說明,積累不變,派生類增加子物件

class student1 : public student      

~student1(){}

protected:

int d;

float e;

student monitor; //定義乙個student型別的子物件

};

關於子物件的問題這裡不會詳細講解,以後會詳細講解

總結起來:

派生類建構函式名(總參數列):基類建構函式名(引數列表),子物件名(引數列表)

派生類中新增資料成員初始化語句

(1)呼叫基類建構函式,初始化基類資料成員

(2)呼叫子物件建構函式,初始化子物件資料成員

(3)再執行派生類自身的建構函式,初始化自身新增的資料成員

當在此基礎上再增加乙個派生類來繼承以上所有類怎麼做呢?

很簡單,如下所示,只需要在讓乙個派生類中再加入新元素即可:

class student2 : public student1

~student2(){} //student2的析構函式

private:

int f;

};

這裡有一點需要注意的是:

在呼叫student2的建構函式時,會先呼叫student1的建構函式,在呼叫student1的建構函式時又會先呼叫student的建構函式

所以student2的初始化順序是:

先初始化基類的資料成員,再初始化student1的資料成員,最後初始化student2的資料成員

1.當不需要對派生類新增成員進行任何初始化操作,派生類建構函式函式體內可以為空

class student1 : public student      //宣告共用派生類student1 

~student1(){} //派生類析構函式

protected:

int d;

float e;

};

2.既然可以選擇繼承基類中的初始化也可以不繼承,比如:不繼承基函式自定義初始化,繼承預設建構函式(見一中**裡的補充)

當然也可以不寫基類建構函式,這樣派生類建構函式就沒有向基類建構函式傳遞引數的任務

析構函式只有一點記住即可

析構函式呼叫的順序和建構函式正好相反:先執行派生類自己的析構函式,對派生類新增的成員進行清理,然後在呼叫子物件的析構函式,對子物件進行清理,最後呼叫基類的析構函式,對基類進行清理

下面看一段**熟練一下

#include using namespace std;

class student //基類

student(char a) //有參建構函式

~student() //基類的析構函式

};class teacher : public student //派生類

~teacher() //派生類析構函式

student monitor; //基型別的子物件

};int main()

編譯結構最終是:aa1bcdd

如果看不懂就讓我來給你們一點一點解釋:

首先從main函式裡出發,在派生類物件中傳了乙個引數b

來到派生類中呼叫建構函式,先呼叫基類中的建構函式,因為這裡帶有引數,所以呼叫的是基函式裡帶參的建構函式,輸出a

然後是呼叫子物件建構函式,子物件未傳參,所以呼叫了基類未傳參建構函式,輸出a1

最後是呼叫自己本身建構函式,因為主函式裡傳入的是b這裡輸出傳的引數,輸出b

呼叫完派生類中建構函式,該呼叫派生類的析構函式了,先呼叫自己本身的析構函式,輸出c

然後呼叫子物件的析構函式輸出d,最後呼叫基類的析構函式輸出d

派生類的建構函式和析構函式

c 學習筆記和總結 這段時間看了c 中類的繼承和派生,這應該算是c 和c語言相比最主要的乙個知識點了。不得不說類的功能是十分強大的,它定義了public,protected,private三種訪問內部成員的訪問許可權,增加了程式的安全性和保護性。通過定義類的物件可以訪問類的成員,但是定義物件是外部訪...

派生類的建構函式和析構函式

一.簡單派生類的析構函式和建構函式。1.簡單派生類建構函式的定義形式 派生類建構函式名 總參數列列 基類建構函式名 參數列列 其中,總參數列列中的引數包括派生類引數和基類引數,且基類引數放在最前面。參數列列裡中只有引數名,沒有引數型別。2.注意簡單派生類建構函式的定義形式中,中間有乙個冒號。3.參數...

派生類建構函式和析構函式的構造規則

先給出程式 includeusing namespace std class first first int x,int y first void show 此時,系統自動呼叫基類的無參建構函式 若類沒有無參建構函式,則呼叫預設的建構函式 也可以顯式的指出具體呼叫基類的哪乙個建構函式,例如 thir...