参照百度经验,复制构造函数有深拷贝和浅拷贝两种,其主要区别是复制指针时是否重新创建内存空间。
以个人的理解,一个比较形象的例子:
一位蜡像师要为你做蜡像,再现的情景是你指着花丛中最艳丽的一朵花,这时候蜡像师就要再塑造一个你,蜡像和你一模一样 但作为两个事物 占据不同的空间,而雕像的手指指向的方向便是一个问题,是指向你正在指向的花呢,还是另雕刻出一朵?
而我们复制一个对象的时候,也会出现这个问题,浅拷贝而来的对象中,如果有指针类型,那么他指向的内存空间会是被复制的对象中指针指向的内存空间,也就是指向了同一朵花,而深拷贝则是又开辟了一块内存空间,复制而来的对象的指针指向于此。
默认的拷贝构造函数属于浅拷贝:
#include <iostream>
#include <string.h>
using namespace std;
class dala_da{
public:
int da;
char *la;
//dala_da(dala_da &y);
dala_da(int, char*);
void show();
~dala_da();
};
dala_da::dala_da(int i, char *j){
da=i;
la=new char[i];
la=j;
}
/*dala_da::dala_da(dala_da &y){
da=y.da;
la=new char[da];
strcpy(la,y.la);
}*/
void dala_da::show(){
cout << " da的数值:" << this->da << " da的地址:" << (void*)&this->da << " " << " la的字符串:" << this->la <<" la字符串首地址:" << (void*)this->la << endl;
}
dala_da::~dala_da(){
cout << "析构函数调用中..." <<endl;
delete[] la;
}
int main(){
dala_da A(10,"hello");
dala_da B=A;
A.show();
B.show();
return 0;
}
由例子我们可以发现,对象A与B中的la指针都指向了0x46e075这个位置,da的内存地址不相同。主函数运行结束是,A和B调用析构函数,这时候一个关键的问题便是0x46e075这个地方被释放了两遍。
而深拷贝则可以避免这个结果:(把上面代码中的拷贝构造函数注释去掉)
A和B的la指针分别指向了不同区域,但其存放的字符串是相同的。这样A对象的字符串更改便不会影响对象B了。