C C 建構函式的呼叫效果

2021-09-03 07:12:44 字數 1187 閱讀 9873

建構函式在建構函式的初始化列表中呼叫才有效果,在建構函式體中呼叫不起作用!

#include using namespace std;

class member

member(int a) : age(a)

void show_age()

private:

int age;

};class family

void show_member()

private:

member m1;

};int main(int argc, char **argv)

default constructor of member

constructor of member

constructor of family

age of member : age = 0

輸出結果的第一行:member類的預設建構函式在family類的建構函式的初始化列表(隱式存在)中被自動呼叫,此時age應該等於0;

輸出結果的第二行:member類的建構函式在family類的建構函式體內被呼叫,此時age應該等於100;

但從輸出結果的最後一行看,age = 0,說明只有在初始化列表中呼叫的預設建構函式起作用了,而建構函式體內呼叫的建構函式沒有起作用,其原因是在建構函式體內呼叫建構函式,生成的是乙個區域性物件,在退出建構函式體後就失效了。也就是說,在c++中,不能在乙個建構函式中呼叫另乙個建構函式,而需要在建構函式的初始化列表中呼叫內嵌物件或基類的建構函式。

或者將family類的建構函式改為:

family() : m1(10)

再看輸出結果:

constructor of member

constructor of member

constructor of family

age of member : age = 10

同樣說明了以上分析的正確性。

在類的建構函式中呼叫其基類或者內嵌物件的建構函式時,一定要在建構函式的初始化列表中呼叫,而不要在建構函式體中呼叫,以確保基類或者內嵌物件的建構函式起作用。

構造函式呼叫建構函式

題目如下 問下列 的列印結果為0嗎?include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,...

建構函式的呼叫

傳智掃地僧課程學習筆記。無參建構函式,有參建構函式,拷貝建構函式,決定,用乙個物件給另乙個物件賦值時候,怎麼去操作,void main22 0呼叫無參建構函式 test2 t0 1括號法 test2 t1 1,2 呼叫引數建構函式 c 編譯器自動的呼叫建構函式 t1.printt 2 號法 test...

C C 中的建構函式

每個類都分別定義了它的物件被初始化的方式,類通過乙個或多個特殊的成員函式來控制其物件的初始化過程,這些函式就叫做建構函式 constructor 建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。建構函式的名字和類名相同,但其沒有返回型別。類可以包括多個建構函式,...