C++中复制构造函数定义如下:

当类的两个对象之间进行复制时调用的构造函数

复制构造函数被调用的情况如下:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 类对象以值的方式传入函数体
  • 一个对象以传值的方式从函数返回
  • 一个对象通过另一个对方初始化

下面看一段代码:

#include <iostream>
using namespace std;

class CExample {
private:
int a;
public:
CExample(int b)
{ 
a=b;
}

CExample(const CExample& C) {
a = C.a;
}

void Show ()
{
cout<<a<<endl;
}
};

int main()
{
CExample A(100);
CExample B=A;
B.Show ();
return 0;
}

以上代码的输入结果为:

100

当把对象A复制到B时会调用CExample(const CExample& C)函数
如果没有自己定义复制构造函数编译器会默认创建一个,默认的构造函数采用的位拷贝

浅拷贝和深拷贝

在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄