C++中Copy Constructor的构造操作

来源:互联网 发布:电纸书阅读器软件 编辑:程序博客网 时间:2024/03/28 18:52

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的虚表