前提:当用户没有创建拷贝构造函数
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的派生类,派生类的对象中都会新增虚拟基类的指针,用以标识虚拟基类在内存中的位置。 在多层继承关系下,如果某个基类需要以它的派生类来构造自己,那么需要修改相应的虚拟基类指针。