深浅拷贝区别:
- 浅拷贝只拷贝指针,但拷贝后两个指针指向同一个内存空间;
- 深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,
- 调用拷贝构造函数后,浅拷贝还有联系,深拷贝的两个对象完全独立。
- 浅拷贝类似于文件创建快捷方式,而深拷贝好比文件复制。
- 编译器默认提供的默认拷贝构造函数是浅拷贝,深拷贝的构造函数需自己实现。
注意:浅拷贝多个对象共用一个资源,当一个对象销毁时,资源就会释放。如果对另一个对在进行销毁。会因为资源重复释放造成程序崩溃!
深拷贝的传统和现代写法:
传统写法:开辟空间复制内容
class String
{
public:
String(const char* 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)
{
delete[] _str;
_str = new char[strlen(s._str) + 1];
strcpy(_str,s._str);
//方法二:
/*char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
delete[] _str;
_str = tmp;*/
}
return *this;
}
~String()
{
delete[] _str;
}
private:
char* _str;
};
现代写法:借助指针交换
class String
{
public:
String(const char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str,str);
}
String(const String& s)
:_str(NULL)
{
String tmp(s._str);
swap(_str,tmp._str);
}
String& operator=(String s)
{
swap(_str,s._str);
return *this;
}
~String()
{
delete[] _str;
}
private:
char* _str;
};