编译器会为每个类提供默认拷贝构造函数。
拷贝构造函数在以下情况下被调用:
一个对象需要通过另外一个对象进行初始化
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
默认拷贝构造函数属于浅拷贝。
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
当类数据成员中含有指针变量时,浅拷贝会造成错误。例如:
A=B,浅拷贝时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
因此需要自定义拷贝构造函数。
class MyClass{
private:
int a;
char *str;
public:
MyClass(int b,char* cstr)
{
a=b;
str=new char[b];
strcpy(str,cstr);
}
MyClass(const MyClass& C)
{
a=C.a;
str=new char[a]; //深拷贝
if(str!=0)
strcpy(str,C.str);
}
~MyClass()
{
delete str;
str=NULL;
}
}