为了更好的理解下面的重载实现,需要知道类成员函数的隐藏参数
string类比较常见的运算符重载:
(1) += :将新的字符串拼接在原来的末尾
(2) = :用一个字符串的内容去替换另一个字符串的内容
(3) > 或 <:比较字符串的大小
(4) [ ]:获取到指定位置上的字符
目录
一、 运算符 +=
我们使用string类的时候常常可以看到下面这种写法
string s;
s += "abc";
运算符 += 可以把一个字符串拼接到当前字符串的末尾
我们直接使用前面 实现了的 push_back 函数和 append函数string类的模拟实现(三)—— 插入字符/字符串_abs(ln(1+NaN))的博客-CSDN博客https://blog.csdn.net/challenglistic/article/details/123975756?spm=1001.2014.3001.5501
1、拼接一个字符
左操作数是隐藏的那个参数
MyString& operator+=(char ch)
{
push_back(ch);
return *this;
}
代码测试:
int main() {
MyString s4("abcd");
s4 += 'p'; //编译时会变成 s4.operator+=('p');
return 0;
}
2、拼接一个字符串
MyString& operator+=(const char* str)
{
append(str);
return *this;
}
二、运算符 =
s1 = s2;
假设现在有两个对象 s1 、s2
s1希望变得和 s2一样,不光是内容一样,空间大小也希望是一样的
(1) 判断是不是自己给自己赋值,即 s1 = s1
(2) 释放原本的空间
(3) 开辟一个和s2一样大的空间
(4) 把 s2 中的内容拷贝到 s1 中
MyString& operator=(const MyString& s)
{
if (this != &s) //防止自己给自己赋值
{
delete[] _str; //释放原空间
_str = new char[strlen(s._str) + 1]; //开辟新空间,不要忘了给\0留个位置
strcpy(_str, s._str);
_size = s._size;
_capacity = s._capacity; //避免空间浪费
}
return *this;
}
代码测试:
int main() {
MyString s1("hello,world");
MyString s2("sort");
s1 = s2;
return 0;
}
三、运算符 >
s1 > s2
两个字符串 逐字符比较,实际上比较的是ASCII码的大小
bool operator>(MyString& s)
{
int cur1 = 0, cur2 = 0;
while (cur1 < _size && cur2 < s._size)
{
if (_str[cur1++] > s._str[cur2++])
{
return true;
}
}
if (cur1 < _size) //s1能继续比较,但s2不行,s1更大
{
return true;
}
if (cur2 < s._size)
{
return false;
}
return false; //s1 == s2
}
代码测试:
int main() {
MyString s1("sort1");
MyString s2("sort");
cout << "比较结果为:" << (s1 > s2) << endl;
return 0;
}
四、运算符 [ ]
在使用数组的时候,常常可以看到
s[1] = 'a';
这个运算符既可以获取指定下标的字符,还可以修改指定下标的字符(要求使用引用返回实现)
char& operator[](int pos)
{
assert(pos >= 0 && pos < _size);
return _str[pos];
}
代码测试:
int main() {
MyString s1("sort");
cout << "索引的结果是:" << s1[1] << endl;
s1[0] = 'S';
cout << "修改的结果是:";
for (size_t i = 0; i < 4; i++)
{
cout << s1[i];
}
cout << endl;
return 0;
}