posts - 134,comments - 22,trackbacks - 0
          一 Default Constructor 的建構操作
             When is a default constructor synthesized? 當編譯器需要它的時候,也就是 synthesized constructor 只執行編譯器所需的行動,并不執行程序員某些的設想。
             看來以前看C++ Primer 4th時在類的那章相關部分沒有弄懂,P459書上說:
            The compiler generates a default constructor automatically only if a class defines no constructors.只有當一個類沒有定義構造函數時,編譯器才會自動生成一個默認構造函數,但這個不是所說的synthesized default constructor

             常見的兩個誤解
          (1)任何class如果沒有定義default constructor ,就會被編譯器合成一個來。
          (2)編譯器合成的 default constructor 會明確地為每一個 data member 賦初值。
           
             四種 nontrivial default constructor:
          (1)帶default constructor的member class object
             如果一個class沒有任何的constructor,但它內含一個member object,后者有default constructor,則該class的 implicit default constructor 就是 nontrival,編譯器需要為此classsynthesize 出一個 default constructor,不過只有在真正需要被調用時才發生。
             合成的構造,考構,賦值運算符都是以inline方式完成的。
             如果含有多個對象成員,則編譯器按照它們的聲明順序在合成的構造函數中調用它們的default構造函數。

          (2)帶default constructor 的base class
             一個帶有default constructor 的基類派生出一個沒有任何constructor的派生類,則次派生類的default constructor 被視為 nontrival,會被編譯器synthesize出來,其中調用基類的default constructor

          class b{
          public:
              b():i(1024){};
              int i;
          };
          class d:public b{

          };

          如果我們創建d類的對象,則在其default constructor 中會調用b的。

          (3)帶有一個 virtual function的class
             其中有兩種情況 1. class聲明或繼承一個 virtual function。  2. class派生自一個繼承串,其中有至少一個 virtual base class。
             這2種情況中,如果程序員沒有定義自己的constructor,編譯器會 synthesize a default constructor.期間會發生如下事件:1.一個vtbl被產生,內放有class中 virtual function地址。
          2.每一個class object中,一個額外的pointer member(就是vptr)被產生,內含 class vtbl的地址。它們被正確初始化是編譯器的責任。

          (4)帶有一個virtual base class的class
            
          virtual base class的實現因編譯器不同而不同,共通目標是定位(locate)virtual base class在其派生類中的位置。

             以上四種情況,編譯器會為未聲明constructor的class 合成一個default constructor,這在C++標準中稱為 implicit nontrivial default constructor,只是為了滿足編譯器需要。
             這四種情況外的而又沒有聲明default constructor的classes,它們擁有的是
          implicit trivial default constructor,實際上并不會被合成出來。
             s
          ynthesized default constructor 中,只有base class object和member class object會被初始化,其它所有nonstatic build-in類型的成員均不會被初始化,因為編譯器不認為這是必須的工作。
          http://blog.chinaunix.net/u2/72955/showart_2059086.html
          posted on 2009-12-10 15:32 何克勤 閱讀(164) 評論(0)  編輯  收藏 所屬分類: C/C++
          主站蜘蛛池模板: 张家港市| 黄骅市| 南乐县| 亳州市| 淳化县| 定安县| 师宗县| 莆田市| 武山县| 营山县| 太白县| 休宁县| 酉阳| 清镇市| 西宁市| 河西区| 宁国市| 英吉沙县| 黑河市| 怀来县| 河曲县| 无锡市| 灵石县| 富顺县| 大石桥市| 聂拉木县| 清远市| 武陟县| 政和县| 黄骅市| 安阳县| 呼和浩特市| 平利县| 卫辉市| 许昌县| 洛宁县| 安龙县| 平昌县| 会泽县| 垫江县| 丘北县|