浅拷贝:也就是值拷贝,将一个对象的值新开辟空间,赋给另一个对象,并没有新开辟空间,而是两个对象共用同一块空间,所以当调用析构函数来释放其中一个对象的资源时,另一个对象并不知道,当它再去调用析构函数销毁资源时,就会出错。
深拷贝:为每个对象分配独立的资源,各自调用各自的析构函数来释放资源,就不会造成因共享资源在多次释放时造成的程序崩溃问题
以实现String类为例:
class String
{
public:
String(const char* str = " ")
{
if (str == NULL)
{
_str = " ";
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
//拷贝构造,深拷贝
String(const String& s)
:_str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
//赋值运算符重载
String& operator=(const String& s)
{
if (this != &s)
{
char* temp = new char[strlen(s._str) + 1];
strcpy(temp, s._str);
delete[] _str;
_str = temp;
}
return *this;
}
~String()
{
if (_str)
{
delete[] _str;
}
}
private:
char* _str;
};