目录
基本结构
string类想实现增删查改那么需要增加两个成员变量,_size和_capacity(存储最大有效字符数,不包括\0)。
相对应的构造函数,赋值重载,拷贝构造以及析构函数也要有所改变。也就是将
【构造函数】:
string(const char* str)
:_size(strlen(str))
, _capacity(_size)
{
_str = new char[_capacity + 1];
strcpy(_str, str);
}
现代写法
//s2(s1)
string(const string& s)
:_str(nullptr)//交换之后tmp为野指针需要赋值
, _size(0)
, _capacity(0)
{
string tmp(s._str);
swap(_str, tmp._str);
swap(_size, tmp._size);
swap(_capacity, tmp._capacity);
}
【拷贝构造】:
string(const string& s)
:_size(s._size)
,_capacity(s._capacity)
{
_str = new char[_capacity + 1];//+1是\0的空间
strcpy(_str, s._str);//传统写法
}
现代写法
//s2(s1)
string(const string& s)
:_str(nullptr)//交换之后tmp为野指针需要赋值
, _size(0)
, _capacity(0)
{
string tmp(s._str);
swap(_str,tmp._str);
swap(_size,tmp._size);
swap(_capacity,tmp._size);
}
【赋值重载】:
string& operator=(const string& s)
{
if (this != &s)
{
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
delete[] _str;
this->_str = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
现代写法
//s1=s3
string& operator=(string& s)
{
string tmp(s);
swap(_str,tmp._str);
swap(_size,tmp._size);
swap(_capacity,tmp._capacity);
reurn *this;
}
//另一种写法
string& operaotr=(string s)
{
swap(_str,s._str);
swap(_size,s._size);
swap(_capacity,s._capacity);
}
//两种写法的思路都是一样的,下面更简洁一些
因为总要用到_str,_size,_capaicty的交换函数 ,所以把这个写到一个函数中。
void swap(string& s)
{
std::swap(_str, s._str);
std::swap(_size, s._size);
std::swap(_capacity, s._capacity);
}
对于swap函数在string类和全局都有一个