裡總結了如下四種情況:
1.如果類內部有成員物件,並且成員物件帶有預設建構函式,那麼編譯器有必要為
這個類合成預設建構函式,以初始化這些成員物件。並且成員物件初始化的順序是按他們在類中宣告的順序。 例:
class blackball
};class redball
};class whiteball {};
class container ;
編譯器為container類合成的預設建構函式可能像下面這個樣子:
container::container()
2. 如果乙個沒有任何constructor的類派生自乙個帶有defaultconstructor基類,那麼編譯器需要為這個
類合成乙個default constructor,在這個defaultconstructor中呼叫基類的default construct。
如果乙個類有各種constructor,但其中沒有defaultconstructor,那麼編譯器會擴充套件每個constructor,
在每個constructor的開頭插入呼叫基類的defaultconstructor的**。
3. 如果類宣告或繼承了乙個虛函式,那麼編譯器需要為這個類合成乙個defaultconstructor
(如果已經存在constructor,就會擴充套件這個建構函式),以初始化編譯器安插在這個類中的指向vtable的指標。
例:
class withvf
}
編譯器合成的default constructor可能像下面這個樣子:
withvf::withvf()
4. 如果乙個類虛繼承了乙個基類,那麼編譯器需要為這個類合成乙個defaultconstructor
(如果已經存在constructor,就會擴充套件這個建構函式),以初始化編譯器安插在這個類中的指向virtualbase class的指標。
default constructor 的建構函式
裡總結了如下四種情況 1.如果類內部有成員物件,並且成員物件帶有預設建構函式,那麼編譯器有必要為 這個類合成預設建構函式,以初始化這些成員物件。並且成員物件初始化的順序是按他們在類中宣告的順序。例 class blackball class redball class whiteball class...
Default Constructor 的構造操作
如何檢視編譯是否生成了預設建構函式?示例 class a class b int main 使用gcc編譯 關閉編譯優化 gcc c o0 a.cpp o a.o使用objdump檢視 objdump t a.o發現有函式符號 zn1ac2ev,使用 c filt 方便檢視,發現就是a的預設建構函式...
內聯函式,建構函式,靜態函
inline,static,constructor三種函式都不能帶有virtual關鍵字。inline是編譯時展開,必須有實體 static屬於class自己的,也必須有實體 virtual函式基於vtable 記憶體空間 constructor函式如果是virtual的,呼叫時也需要根據vtabl...