- 4種情況下編譯器會構造出nontrivial(有用)的構造函數
- 帶有default construction的member class object
我們有兩個class:
class Foo { public: Foo(), Foo(int) … };
class Bar { public: Foo foo; char *str;};
- 則編譯器會在Bar中合成一個默認的構造函數(看起來像這樣):
Bar() { foo.Foo::Foo(); } - 當我們自己定義了Bar一個或以上的構造函數時,編譯器會爲我們擴張
每一個構造函數。比如我們自己定義:
Bar() { str = 0;}
則編譯器就爲我們擴張成:
Bar() { foo.Foo::Foo(); str = 0; } - 當有多個需要初始化的成員時,編譯器會按照成員的聲明次序來初始化成員
- 則編譯器會在Bar中合成一個默認的構造函數(看起來像這樣):
- 帶有default construction的base class
- 聲明或繼承一個virtual function的class
- 一個virtual function table 會被編譯器產生出來,內放class的virtual function 地址。
- 在每個class object中,一個額外的pointer member(vptr)會被編譯器合成出來,內含
相關的class vtbl的地址。
- 帶有一個virtual base class的class
對於virtual base class中的成員變量,derived class通過存放一個指針,指針中存放
着對應的基類,用這樣的方式來訪問virtual base class中的成員變量。
所以爲了初始化這些指針,編譯器會默認構造出或擴張nontrivial構造函數做這些初
始化的工作。
- 帶有default construction的member class object
- c++新手常見的兩個誤解
- 任何class如果沒有定義default constructor,就會被合成出來。
- 編譯器合成出來的default constructor會明確設定class內每個
datamember的默認值。
這兩個沒有一個是真的
default construction
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.