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適當初始化。
             同類型的對象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 何克勤 閱讀(233) 評論(0)  編輯  收藏 所屬分類: C/C++
          主站蜘蛛池模板: 肥东县| 康马县| 江孜县| 浦城县| 丽水市| 兴海县| 衡东县| 陇川县| 车致| 清徐县| 和林格尔县| 清水县| 富裕县| 宿松县| 辽中县| 永嘉县| 通化市| 汝城县| 濮阳县| 敖汉旗| 东乡族自治县| 兰溪市| 锡林浩特市| 新沂市| 乌鲁木齐县| 阿克陶县| 沙洋县| 文化| 织金县| 河津市| 忻城县| 庄河市| 屏南县| 增城市| 志丹县| 化隆| 河北省| 灵璧县| 揭阳市| 岳池县| 石河子市|