实现一个自己的String类是一道考验C++基础知识的好题。
至少要能实现以下:构造函数、析构函数、拷贝构造函数(copy constructor)、重载赋值操作符(copy assignment operator)。首先是至少能够准确的写出这几个函数的声明。
class String{
public:
String();
String(const char *);
String(String rhs);
String& operator = (String rhs);
private:
char* data_;
}
其次,老版本的拷贝构造函数和重载赋值操作符时,有几点需要注意的是:判断自己赋值给自己和异常安全性。通过使用swap可以简化方法。下面是老版本的拷贝构造函数的实现,new的时候有可能会抛出异常。
String::String(String rhs){
std::swap(data_,rhs.data_);
}
String::String& operator = (Sring rhs){
std::swap(data_,rhs.data_);
return *this;
}
String::~String():
delete [] data_;
}
使用swap的拷贝构造函数,通过swap将临时变量rhs中的数据保存到了data_中,同时data_中的数据拷贝到了临时变量中,在函数返回时会被自动释放。一举两得,也不用担心有异常发生了。
String::String(String rhs){
std::swap(data_,rhs.data_);
}
String::String& operator = (String rhs){
std::swap(data_,rhs.data_);
return *this;
}
String::String():data_ = new char[1]{
*data_ = '\0';
}