我們將上面的Word類改寫成下面的樣子: Class Word { public: Word(const String&);//注重這里和我們開始的X(X&)形式一樣 ~Word(); //...... private: int cnt; String str; // 這個成員是String類的對象,String是我們自定義的類型 }; Class String { public: String(const char*); String(const String&);//這里聲明了一個Copy constructir ~String(); //...... } 這時在執行我們的代碼 #include "Word.h" Word noun("lsmodel"); void foo() { Word verb=noun; } 編譯器會為我們的Word類合成一個Copy Constructor,用來調用它的str(member class String object)的Copy Constructor.象下面偽碼表示的這樣: inline Word::Word(const Word &wd) { str.String::String(wd.str); cnt=wd.cnt; } 當這個類中有一個或多個虛函數時,或者這個類是派生于一個繼續串鏈,并且這個串中有一個或多個虛擬的基類時.這個類在進行拷貝時便不會展現逐次拷貝(bitwise copy).并且會通過合成的Copy Constructor來重新明確的設定vptr來指向虛函數表,而不是將右邊對象的vprt直接拷貝過來.書上的ZooAnimal例子的圖可以很清楚的描述出這點?! 〖偃缫粋€對象以另一個對象做初值,而后者有一個Virtual Base Class Subobject,那會怎樣呢?任何一個編譯器都會做到在派生類對象中的virtual base class Subobject的位置在執行期就預備妥當,但bitwise copy可能會破壞這一位置,因此也需要由編譯器合成出一個copy constructor,來安插一些代碼來設定virtual base class pointer/offset,對每一個成員執行必要的memberwise初始化操作,以及執行內存相關的工作。 最后我們來總結一下上面說的內容,確實有些亂.雷神越來越覺得自己的缺乏文字描述能力.