<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 memberwise initialization
       通常我們都會為非抽象類定義拷貝構(gòu)造函數(shù),如果沒有定義時,我們以class的一個object作為另一個object的初值時,編譯器內(nèi)部以default memberwise initialization 方式完成,對于member class object 則不會拷貝,而是遞歸調(diào)用 memberwise initialization。
       copy constructor和default constructor一樣,在必要的時候才由編譯器產(chǎn)生出來。copy constructor 以初始化的方式復(fù)制object,另一種是指定值(assignment),通過copy assignment operator

    二 bitwise copy semantics
       編譯器是否合成出考構(gòu)是看class是否展現(xiàn)了 bitwise copy semantics,

    // declaration exhibits bitwise copy semantics
    class Word {
    public:
       Word( const char* );
       ~Word() { delete [] str; }
       // ...
    private:
       int cnt;
       char *str;
    };

    如書中所說,這個展現(xiàn)了bitwise copy semantics,why?

    // declaration does not exhibits bitwise copy semantics
    class Word {
    public:
       Word( const String& );
       ~Word();
       // ...
    private:
       int cnt;
       String str;
    };

    這個沒有展現(xiàn),同樣不明白。。。。。。。
    對于后者,編譯器就會合成出一個 copy constructor。

    那么什么時候不展現(xiàn)bitwise copy semantics呢,分為四種情況
    (1)class 內(nèi)含一個member object ,后者聲明有一個copy constructor,無論是程序員聲明的,還是被編譯器合成的。
    (2)class 繼承自的基類有一個copy constructor,無論程序員聲明的,還是被編譯器合成的。
       對于這2種情況,編譯器必須將memb或base class的copy constru調(diào)用操作安插到被合成的copy constr中。
    (3)class聲明了一個或多個 virtual function時
    (4)class派生的基類串中至少有一個virtual base class時。

       情況3中,類中會額外增加vptr和vbtl,故就不在展現(xiàn)bitwise seamantics了,編譯器需要合成出一個copy constructor,以將vptr適當(dāng)初始化。
       同類型的對象vptr指向的相同的vtbl,基類和派生類的不同,看一段程序

    class b{
    public:
        int i;
        virtual void f(){}
    };
    class d:public b{
    public:
        int ii;
    };

    int main(void) {
        b bbb;
        d dob;
        d bob;
        cout<<&bbb<<" "<<&bbb.i<<" "<<endl;
        cout<<&dob<<" "<<&dob.i<<" "<<&dob.ii<<endl;
        cout<<&bob<<" "<<&bob.i<<" "<<&bob.ii<<endl;
        int *p=(int *)&bbb;
        int *p2=(int *)&dob;
        int *p3=(int *)&bob;
        cout<<"bbb vptr ->"<<*p<<endl;
        cout<<"dob vptr ->"<<*p2<<endl;
        cout<<"bob vptr ->"<<*p3<<endl;

        b bb2=dob;
        cout<<&bb2<<" "<<&bb2.i<<" "<<endl;
        int *p4=(int *)&bb2;
        cout<<"bb2 vptr ->"<<*p4<<endl;
        puts("end in main");
        return EXIT_SUCCESS;
    }

    輸出:

    0x22ff78 0x22ff7c
    0x22ff68 0x22ff6c 0x22ff70
    0x22ff58 0x22ff5c 0x22ff60
    bbb vptr ->4409528
    dob vptr ->4409544
    bob vptr ->4409544
    12 12
    0x22ff48 0x22ff4c
    bb2 vptr ->4409528
    end in main

    b bb2=dob; 語句處,發(fā)生了派生類對象的切割,其vptr指向了基類的vbtl,而不是派生類。

    參考文章:
    轉(zhuǎn)-復(fù)制概念相關(guān),深拷貝與淺拷貝
    posted on 2009-12-10 15:35 何克勤 閱讀(227) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 中国好声音第二季免费播放| 亚洲色欲色欱wwW在线| 亚欧乱色国产精品免费视频| 四虎AV永久在线精品免费观看| 亚洲依依成人亚洲社区| 四虎影院免费视频| 精品亚洲国产成人av| 国产精品极品美女免费观看| 亚洲精华液一二三产区| 国产特级淫片免费看| 免费一级全黄少妇性色生活片 | 亚洲人成在线播放网站岛国| 大地资源在线资源免费观看| 亚洲国产精品无码专区| 亚洲精品免费观看| 亚洲欧洲日产国码二区首页| 欧美在线看片A免费观看| 亚洲精品国产综合久久久久紧| 四虎永久在线精品免费观看地址| 一级毛片免费视频网站| 国产亚洲成av人片在线观看| 久久精品人成免费| 亚洲人成网男女大片在线播放| 国产乱弄免费视频| 成人A片产无码免费视频在线观看| 亚洲综合婷婷久久| 日本一道一区二区免费看 | 亚洲精品一卡2卡3卡四卡乱码| 亚洲Av无码乱码在线znlu| 在线播放免费人成毛片乱码| 亚洲视频在线观看网址| 日韩毛片免费在线观看| 久久最新免费视频| 亚洲人成网站色在线观看| 亚洲乱码中文字幕手机在线| 99国产精品免费视频观看| 色窝窝亚洲av网| 久久久亚洲欧洲日产国码二区| 精品久久洲久久久久护士免费| 青柠影视在线观看免费| 伊人久久五月丁香综合中文亚洲 |