实现String的构造函数、拷贝构造函数、赋值运算符的重载、析构函数?
class String
{
private:
char* data;
public:
String();
String(const char* pstr);
String(const String& str);
String& operator=(const String& str);
virtual ~String();
};
//默认构造函数,要初始化一个空的字符串
String::String()
{
data = new char[1];
data[0] = '\0';
}
//C字符串的有参构造函数
String::String(const char* pstr)
{
data = new char[strlen(pstr) + 1];
strcpy(data, pstr);
}
//拷贝构造函数,需要深拷贝
String::String(const String& str)
{
data = new char[strlen(str.data) + 1];
strcpy(data, str.data);
}
//赋值运算符重载,也要深拷贝
//并且注意返回值是引用,要防止自赋值,参数传const引用
String& String::operator=(const String& str)
{
if (this != &str)
{
char* tmp = new char[strlen(str.data) + 1];
strcpy(tmp, str.data);
delete[] data;
data = tmp;
}
return *this;
}
String:: ~String()
{
if (data != nullptr)
{
delete[] data;
data = nullptr;
}
}
//另外,关于拷贝构造函数、赋值运算符重载函数的深拷贝,还有另外一种写法,
//通过复用构造函数偷梁换柱。
//拷贝构造函数,需要深拷贝
String::String(const String& str)
{
data = nullptr;
String tmp(str.data);
swap(data, tmp.data);
}
//赋值运算符重载,也要深拷贝
//并且注意返回值是引用,要防止自赋值,参数传const引用
String& String::operator=(const String& str)
{
if (this != &str)
{
String tmp(str.data);
swap(data, tmp.data);
}
return *this;
}