1.会以一个object的内容作为另一个class object的初值的三种基本情况
class X{...};
X x;
第一种: X xx = x;
第二种:值传递给函数 void test(X x);
第三种:作为函数返回类型 X test();
2.什么是Default Memberwise Intialization
当class object以相同class的另一个object作为初值时,其内部是以Default Memberwise Intialization(默认成员逐次初始化)的形式完成的:其实质就是把每一个内建的或者派生的data member的值,从某个object拷贝到另一个object上。遇到member class object,以递归的方式继续施行memberwise initalization
3.如何实现上述操作
被copy constructor实现的
4.copy construtor如何实现
和默认构造一样,c++标准中说,如何class没有声明一个copy construtor,就会有隐式的声明或隐式定义。而c++标准把拷贝构造又分为trival 和nontrival。只有nontrival的实例才会被合成到程序中。决定一个拷贝构造是否为trivial的标准中在于class是否展现bitwise copy semantics(位依次拷贝)。展现位依次拷贝的就不需要合成默认拷贝构造了
5.class不展现出“bitwise copy semantics”的情况(也就是在没有显式定义拷贝构造的情况下,编译器为我们合成默认拷贝构造的情况)
1.当class内含一个member object而后者的class声明有一个copy constructor(此拷贝构造合成的也算)时
2.当class继承自一个base class而后者存在一个copy constructor
3. 当class声明了一个或多个虚函数时
4.当class派生自一个继承串链,其中有一个或者多个virtual base classes时。
(ps :上述四种情况和和合成默认构造函数条件相似,可以参考我的另一篇博文http://write.blog.csdn.net/postlist)
5.应该注意的几点(实例说明)
当编译器导入一个vptr到class中,该class就不再展现bitwise semantics了。
class ZooAnimal
{
ZooAnimal();
virtual ~ZooAnimal();
virtual void animate();
virtual void draw();
//...
private:
//ZooAnimal的animate()和draw()
//所需要的数据
}
class Bear : public ZooAnimal
{
public:
Bear();
void animate();
void draw();
virtual void dance();
//...
private:
//所需要的数据
}
Bear yogi; yogi会被Bear类默认构造函数初始化,其vptr会被设置为指向Bear class的virtual table
Bear winnie = yogi;
ZooAnimal franny = yogi; //会发生切割行为franny的vptr会指向ZooAnimal class的虚表