<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 何克勤 閱讀(163) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 国产区图片区小说区亚洲区| 国产精品亚洲片夜色在线| 黄色网址大全免费| 国产精品色午夜视频免费看| 亚洲熟妇自偷自拍另欧美| 一个人看www在线高清免费看| 亚洲综合综合在线| 91免费人成网站在线观看18| 亚洲精品**中文毛片| 免费人成在线观看69式小视频| 亚洲精品午夜视频| 成年女人毛片免费观看97| 国产亚洲人成在线播放| 亚洲成年人啊啊aa在线观看| 久久九九久精品国产免费直播| 亚洲桃色AV无码| 99爱在线观看免费完整版| 亚洲欧洲久久精品| 野花高清在线观看免费3中文 | 亚洲国产精品久久人人爱| 亚洲免费视频播放| 亚洲欧美成人综合久久久| 亚洲成av人片不卡无码久久 | 一级毛片免费播放| 亚洲成a人片在线网站| 精品国产免费一区二区| 特级aa**毛片免费观看| 亚洲精品制服丝袜四区| 色老头永久免费网站| 亚洲AV成人无码网站| 亚洲女同成av人片在线观看| ww4545四虎永久免费地址| 亚洲av午夜国产精品无码中文字| 亚洲人成无码www久久久| 日本一卡精品视频免费| 亚洲精品久久无码| 国产aⅴ无码专区亚洲av| 一二三四在线播放免费观看中文版视频| 四虎国产精品永免费| 亚洲欧洲精品在线| 亚洲精品成人a在线观看|