C++ 编译器什么时候会帮助创建拷贝构造函数

前提:当用户没有创建拷贝构造函数

1.Memberwise初始化

      逐个给成员变量赋值,这是最常见的拷贝方式。

2.Bitwise Copy属性

      Class具有Bitwise Copy属性时,直接用memcpy内存拷贝,此时编译器不会合成拷贝构造函数。

总之,只要Class不具备Bitwise Copy属性,编译器就会合成拷贝构造函数。

没有Bitwise Copy属性与Default Constructor类似,也分四种情况:

1.“带有Copy Constructor”的Member Class Object

2.“带有Copy Constructor”的Base Class

3.“带有Virtual Function”的Class

4.“带有Virtual Base Class”的Class

  •     “带有Copy Constructor”的Member Class Object

     #include <iostream>
  
  
     class A
    {
      public:
       A()
      {
          std::cout << "construct A"<< std::endl;
      }
  
        A(A&)
      {
         std::cout << "copy A" << std::endl;
     }
 };                                                                                                                      
  
 class B
 {
   public:
      A a1; 
  };
  

void func(B b){

    ...

}


如上func函数参数传入的是类B对象自己,进行值传递将调用拷贝构造函数
      B b0;
      func(b0);
    return 0;
 }

  • 带有Virtual Function”Class

  举个例子

 

class A {

    public:

       virtual Print();

       int a_;

};

class B : public A {

    public:

       virtual Print();

       int b_;

};

这个时候A、B都有自己的虚表指针__vptr__

创建个main函数,main函数中

1 B b0;

2 B b1=b0;

3 A a = b0;

        第2行代码,如果用bitwise copy没问题;

      第3行代码, bitwise copy绝对不行,因为b0__vptr__此时指向class B的虚函数表,而a__vptr__期望的是class A的虚函         数表。

      编译器需要合成A的拷贝构造函数,将__vptr__赋予正确的值。

  •       带有Virtual Base Class”Class

        对于包含有virtual base class的派生类,派生类的对象中都会新增虚拟基类的指针,用以标识虚拟基类在内存中的位置。 在多层继承关系下,如果某个基类需要以它的派生类来构造自己,那么需要修改相应的虚拟基类指针。

发布了41 篇原创文章 · 获赞 136 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/songguangfan/article/details/88219711