先來看一下下面這段代碼狼犯,思考一下會發(fā)生什么?
class A {
};
A a;
有經(jīng)驗的小黃鴨應該會知道,這里面調(diào)用了A類的默認構(gòu)造函數(shù)屏鳍。
下面講解一下:
這段代碼定義了一個空的類A,并進行實例化出了類型A的對象a局服。
小黃鴨小A:那么什么是實例化呢钓瞭?
實例化的過程是分配一塊內(nèi)存空間,然后對其內(nèi)存空間的數(shù)據(jù)進行初始化淫奔。
這是兩個步驟:
1山涡、分配內(nèi)存
2、初始化內(nèi)存數(shù)據(jù)
然后在初始化的時候就是執(zhí)行了A類的構(gòu)造函數(shù)唆迁,也就是說上面的代碼會分配一塊內(nèi)存給a鸭丛,并執(zhí)行了A類的構(gòu)造函數(shù)。
小黃鴨小A:你騙人唐责,這里并沒有看到你說的構(gòu)造函數(shù)呀
其實編譯器會自動給我們生成一個默認的構(gòu)造函數(shù)鳞溉,但是~。
運行一下下面這段代碼
class A {
public:
A(int i) : a(i) {
}
private:
int a;
};
A a;
小黃鴨小B:呱呱鼠哥,這代碼根本編譯不通過呀
error: no matching constructor for initialization of 'A'
小黃鴨小A:這看上去是因為沒有構(gòu)造函數(shù)
對的熟菲,是因為上面這段代碼給類A定義了一個構(gòu)造函數(shù)A(int i),所以編譯器認為不需要再為你自動生成一個默認的構(gòu)造函數(shù)了朴恳。
然后我們定義的A(int i)是一個有參數(shù)的構(gòu)造函數(shù)抄罕,實例化a時需要的是一個無參數(shù)的構(gòu)造函數(shù),此時編譯階段發(fā)現(xiàn)沒有無參數(shù)的構(gòu)造函數(shù)于颖,于是編譯器報錯了贞绵。
眾鴨子:呱呱呱