这里我实现的 String 类主要写了一下它的构造函数、拷贝构造函数(传统写法和现代写法)、赋值运算符重载(传统写法和现代写法)和析构函数,并且类的成员变量只有一个 _pStr。
class String
{
public:
String(const char* pStr = "")
:_pStr(new char[strlen(pStr)+1])
{
strcpy(_pStr,pStr);
}
//深拷贝的传统写法:
//String(const String& s)
// :_pStr(new char[strlen(s._pStr)+1])
//{
// if (this != &s) //这个判断语句完全可以没有
// {
// strcpy(this->_pStr,s._pStr);
// }
//}
//深拷贝的两种现代写法:
//第一种写法:借助构造函数
String(const String& s) //会调用一次析构函数
:_pStr(NULL)
{
String tmp(s._pStr);
std::swap(_pStr,tmp._pStr);
}
//第二种写法:借助拷贝构造函数
//String(const String& s) //会调用一次析构函数
//:_pStr(NULL)
//{
// String tmp(s);
// swap(_pStr,tmp._pStr);
//}
//赋值运算符重载的传统写法:
//String& operator = (const String& s)
//{
// //不允许自己给自己赋值
// if (this != &s)
// {
// //先开空间,根据源 str 的长度
// char* tmp = new char[strlen(s._pStr)+1];//新开的空间之后由目标对象维护
// //将源 str 的内容拷贝到新开的空间中
// strcpy(tmp,s._pStr);
// //将目标对象指向的空间先释放
// delete[] _pStr;
// //将目标对象指向给新的对象
// _pStr = tmp;
// }
// return *this;
//}
//第一种写法:借助构造函数
String& operator =(const String& s) //会调用一次析构函数
{
if (this != &s)
{
String tmp(s._pStr);
std::swap(_pStr,tmp._pStr);
}
return *this;
}
//第二种写法:借助拷贝构造函数
//String& operator =(String s)//函数调用时会进行一次拷贝构造,会调用一次析构函数
//{
// swap(_pStr, s._pStr);
// return *this;
//}
~String()
{
std::cout<<"(~String())"<<std::endl;
if (_pStr)
delete[] _pStr;
}
const char* c_str() const //修饰返回值、修饰this指针
{
return this->_pStr;
}
private:
char* _pStr;
};
首先实现简单的,容易理解。后面会实现 String 类的增删查改等各种操作,后面实现时类的成员变量会增加到三个。