<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 何克勤 閱讀(162) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 无码久久精品国产亚洲Av影片| www亚洲精品少妇裸乳一区二区| 亚洲av午夜福利精品一区| 在线播放国产不卡免费视频 | 亚洲色图激情文学| 97在线视频免费公开观看| 97se亚洲综合在线| 国产91免费在线观看| youjizz亚洲| 永久久久免费浮力影院| 亚洲AV无码AV日韩AV网站| 免费在线观看一级毛片| 五月婷婷免费视频| 久久亚洲精品中文字幕三区| 亚洲国产精品免费视频| 亚洲国产精品成人久久久| 少妇高潮太爽了在线观看免费| 亚洲性无码AV中文字幕| 免费在线观看的黄色网址| 一级一级毛片免费播放| 亚洲成年人在线观看| 无码日韩人妻av一区免费| 美女视频黄频a免费观看| 亚洲日韩中文无码久久| 真人做A免费观看| 国产亚洲视频在线观看网址| 中文字幕在线亚洲精品| 亚洲免费观看网站| 最新亚洲人成无码网www电影| 亚洲综合图色40p| 在线v片免费观看视频| 免费无码AV一区二区| 亚洲第一成年男人的天堂| 女人18毛片水最多免费观看| 一区二区三区免费电影| 亚洲视频手机在线| 亚洲AV日韩精品一区二区三区| 国产亚洲免费的视频看| 亚洲日韩亚洲另类激情文学| 亚洲中文字幕日产乱码高清app | 中文字幕在线观看亚洲视频|