背景
如果不提供位拷贝(浅拷贝),那么会造成一下问题
1、两个不同的指针指向同一块堆上资源,可能造成重复析构,程序崩溃
2、文件句柄,socket重复关闭
3、虚函数表指针丢失
什么时候生成默认拷贝函数
编译器编译的时候默认生成的,如果不生成会和C++11语法冲突
以下情况不得不生成:
(1)类成员变量也是一个类
class A{
private:
B b;//类B有默认拷贝构造函数
//为了调B的默认拷贝构造函数,编译器不得不为A生成一个默认拷贝
};
(2)类继承一个基类,该基类有默认拷贝构造函数,编译器也会给子类生成一个
(3)类成员中虚函数
(4)类继承自基类,基类中有虚函数
什么时候会触发拷贝构造函数
1、赋值
//通过b对象构造a对象,把b赋值a
A b;
A a(b);
//或者
A b;
A a = b;
2、函数参数 形参为类对象
3、函数返回值
默认情况下,会使用编译器优化,返回值优化,只会触发一次,直接赋给对象
void func(){
A a;//1.构造a
return a;//2.返回时用另一个对象接收,拷贝构造
}//3.析构a
A a = func();
C++11以后,如果禁掉优化,看类内是否有移动构造,a是将亡值,赋a时考虑有没有移动构造,把a的资源移给a;看类有没有拷贝构造
如果以上两种构造都没有,会报错