關於預設建構函式兩個常見的誤解:
1.任何乙個class,如果沒有定義預設建構函式(default constructor) ,編譯器都會為其合成乙個預設建構函式
2.編譯器合成的預設建構函式,會設定會明確設定資料成員的預設值
編譯器不是總會為class合成預設建構函式,只是在編譯器需要時才合成,注意:是編譯器需要,而不是程式需要。
那在什麼情況下,編譯器會合成預設建構函式呢?
在沒有顯示宣告任何建構函式時,下面4種情況編譯器會合成預設建構函式
1.類的物件成員帶有預設建構函式
因為需要在類的建構函式中呼叫物件成員的預設建構函式,所以這時編譯器會合成預設建構函式,
如果有多個物件成員,會按照宣告順序依次呼叫其預設建構函式,而且他們的呼叫是在程式顯示的初始化基本資料成員(如int)之前。
2.基類帶有預設建構函式
因為需要在子類的建構函式中呼叫基類的預設建構函式,所以此時編譯會合成乙個建構函式
3.帶有虛函式的類,宣告或繼承了乙個虛函式
帶有虛函式的類物件,編譯器都會為其安插乙個vptr的指標,指向vtbl,以實現多型機制,
在構造這樣的物件時,vptr需要設定初始值(即:虛函式表),
所以此時,如果沒有顯示定義任何建構函式,編譯器會為其合成乙個預設建構函式。
4.在繼承鏈中有乙個或多個虛基類
構造物件時,編譯器會為物件安插乙個指向虛基類的指標,所以需要合成乙個預設建構函式,並初始化這個虛基類指標。
其他情形,編譯器不會合成預設建構函式。
預設建構函式和合成預設建構函式
當我們沒有為類中的物件提供初始值,此時就會執行預設初始化,類會通過乙個特殊的建構函式來控制預設初始化過程,這個函式叫做預設建構函式,這個函式並不需要任何的實參,但是如果我們的類沒有顯式地定義建構函式,那麼編譯器就會為我們隱式地定義乙個預設建構函式 只要沒有顯式定義建構函式,編譯器就會提供預設建構函式...
預設建構函式
只要定義乙個物件時沒有提供初始化式,就使用預設建構函式。為所有形參提供預設實參的建構函式也定義了預設建構函式。乙個類哪怕只定義了乙個建構函式,編譯器也不會再生成預設建構函式。這條規則的根據是,如果乙個類在某種情況下需要控制物件初始化,則該類很可能在所有情況下都需要控制。合成的預設建構函式 synth...
預設建構函式
原諒我是個菜鳥,總在些小地方不經意出錯。include using namespace std class x x x private int a int main 你是否看得出 出錯了呢?接下來讓我們編譯看看 constructfunc.cpp in function int main const...