经典写法:
//经典写法
class String
{
public:
//全缺省构造函数
String(const char* str = "")
:_data(new char[strlen(str) + 1])
{
strcpy(_data, str);
}
//浅拷贝(编译器默认生成的拷贝构造函数)
//浅拷贝只拷贝String中的内容,析构时可能会造成同一份资源的二次释放
//赋值时还可能造成被赋值对象之前的资源泄漏
/*String(const String& str)
:_data(str._data)
{
}*/
//深拷贝
String(const String& str)
:_data(new char[strlen(str._data) + 1])
{
strcpy(_data, str._data);
}
//赋值运算符重载函数
String& operator=(const String& str)
{
if (this != &str)
{
//深拷贝
//释放原有空间
delete[] _data;
//申请新的空间
_data = new char[strlen(str._data) + 1];
//拷贝内容
strcpy(_data, str._data);
}
return *this;
}
//析构函数
~String()
{
if (_data)
{
delete[] _data;
_data = nullptr;
}
}
private:
char* _data;
};
现代写法:
//现代写法
class String
{
public:
//全缺省构造函数
String(const char* str = "")
:_data(new char[strlen(str) + 1])
{
strcpy(_data, str);
}
//浅拷贝(编译器默认生成的拷贝构造函数)
//浅拷贝只拷贝String中的内容,析构时可能会造成同一份资源的二次释放
//赋值时还可能造成被赋值对象之前的资源泄漏
/*String(const String& str)
:_data(str._data)
{
}*/
//拷贝构造函数
String(const String& str)
:_data(nullptr)
{
String tmp(str._data);
swap(_data, tmp._data);
}
//赋值运算符重载函数
//通过调用拷贝构造函数,创建一个形参对象,完成新的空间申请和内容拷贝
//通过调用形参对象析构完成原有空间释放
String& operator=(String str)
{
swap(_data, str._data);
return *this;
}
//析构函数
~String()
{
if (_data)
{
delete[] _data;
_data = nullptr;
}
}
private:
char* _data;
};