建構函式在建構函式的初始化列表中呼叫才有效果,在建構函式體中呼叫不起作用!
#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 建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。建構函式的名字和類名相同,但其沒有返回型別。類可以包括多個建構函式,...