问答题 什么是深拷贝?什么是浅拷贝
【正确答案】
【答案解析】如果一个类拥有资源(堆或者是其他系统资源),当这个类的对象发生复制过程时,资源重新分配,这个过程就是深拷贝;反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。
例如,在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位复制,也就是把对象里的值完全复制给另一个对象,如A=B,这时,如果类B中有一个成员变量指针已经申请了内存,那么类A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了,如通过析构函数,这时A内的指针就变成野指针了,导致运行错误。
深拷贝的程序示例如下:
#include<iostream>
using namespace std;
class CA
{
public:
CA(int b,char* cstr);
CA(const CA&C);
void Show();
~CA();
private:
int a:
char *str;
};
CA::CA(int b,char* cstr)
{
a=b;
str=new char[b];
strcpy(str,cstr);
}
CA::CA(const CA&C)
{
a=C.a;
str=new char[a];∥深拷贝
if(str!=0)
strcpy(str,C.str);
}
void CA::Show()
{
cout<<str<<endl;
}
CA::~CA()
{
delete str;
}
int main()
{
CA A(10,"Hello");
CAB=A;
B.Show();
return 0;
}
程序输出结果:
Hello
浅拷贝资源后,在释放资源时会产生资源归属不清的情况,导致程序运行出错。Test(Test&c_t)是自定义的复制构造函数,复制构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用。当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象时,复制构造函数就会被自动调用。如果没有自定义复制构造函数时,系统将会提供给一个默认的复制构造函数来完成这个过程,上面代码的复制核心语句就是通过Test(Test&c_t)复制构造函数内的p1=c_t.p1,语句完成的。