我们将上面的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初始化操作,以及执行内存相关的工作。 最后我们来总结一下上面说的内容,确实有些乱.雷神越来越觉得自己的缺乏文字描述能力.