default construction

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