当前位置:   article > 正文

string类的模拟实现(五)—— 运算符重载_字符串类中+=运算符重载的功能是啥

字符串类中+=运算符重载的功能是啥

为了更好的理解下面的重载实现,需要知道类成员函数的隐藏参数

类成员函数学习——隐藏的this指针 + const修饰类成员函数_abs(ln(1+NaN))的博客-CSDN博客不同对象调用同一个函数,那么这个函数是如何区分不同对象的呢??https://blog.csdn.net/challenglistic/article/details/124076471?spm=1001.2014.3001.5502

string类比较常见的运算符重载:

(1) += :将新的字符串拼接在原来的末尾

(2) = :用一个字符串的内容去替换另一个字符串的内容

(3) > 或 <:比较字符串的大小

(4) [ ]:获取到指定位置上的字符


目录

一、 运算符 +=

1、拼接一个字符

2、拼接一个字符串

二、运算符 =

三、运算符 >

四、运算符 [ ]


一、 运算符 +=

我们使用string类的时候常常可以看到下面这种写法

  1. string s;
  2. 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、拼接一个字符

左操作数是隐藏的那个参数

  1. MyString& operator+=(char ch)
  2. {
  3. push_back(ch);
  4. return *this;
  5. }

 代码测试:

  1. int main() {
  2. MyString s4("abcd");
  3. s4 += 'p'; //编译时会变成 s4.operator+=('p');
  4. return 0;
  5. }

2、拼接一个字符串

  1. MyString& operator+=(const char* str)
  2. {
  3. append(str);
  4. return *this;
  5. }

二、运算符 =

s1 = s2;

假设现在有两个对象 s1 、s2

 s1希望变得和 s2一样,不光是内容一样,空间大小也希望是一样的

(1) 判断是不是自己给自己赋值,即 s1 = s1

(2)  释放原本的空间

(3)  开辟一个和s2一样大的空间

(4) 把 s2 中的内容拷贝到 s1 中

  1. MyString& operator=(const MyString& s)
  2. {
  3. if (this != &s) //防止自己给自己赋值
  4. {
  5. delete[] _str; //释放原空间
  6. _str = new char[strlen(s._str) + 1]; //开辟新空间,不要忘了给\0留个位置
  7. strcpy(_str, s._str);
  8. _size = s._size;
  9. _capacity = s._capacity; //避免空间浪费
  10. }
  11. return *this;
  12. }

代码测试:

  1. int main() {
  2. MyString s1("hello,world");
  3. MyString s2("sort");
  4. s1 = s2;
  5. return 0;
  6. }


三、运算符 >

s1 > s2

 两个字符串  逐字符比较,实际上比较的是ASCII码的大小

  1. bool operator>(MyString& s)
  2. {
  3. int cur1 = 0, cur2 = 0;
  4. while (cur1 < _size && cur2 < s._size)
  5. {
  6. if (_str[cur1++] > s._str[cur2++])
  7. {
  8. return true;
  9. }
  10. }
  11. if (cur1 < _size) //s1能继续比较,但s2不行,s1更大
  12. {
  13. return true;
  14. }
  15. if (cur2 < s._size)
  16. {
  17. return false;
  18. }
  19. return false; //s1 == s2
  20. }

代码测试:

  1. int main() {
  2. MyString s1("sort1");
  3. MyString s2("sort");
  4. cout << "比较结果为:" << (s1 > s2) << endl;
  5. return 0;
  6. }

四、运算符 [ ]

在使用数组的时候,常常可以看到

s[1] = 'a';

这个运算符既可以获取指定下标的字符,还可以修改指定下标的字符(要求使用引用返回实现)

  1. char& operator[](int pos)
  2. {
  3. assert(pos >= 0 && pos < _size);
  4. return _str[pos];
  5. }

 代码测试:

  1. int main() {
  2. MyString s1("sort");
  3. cout << "索引的结果是:" << s1[1] << endl;
  4. s1[0] = 'S';
  5. cout << "修改的结果是:";
  6. for (size_t i = 0; i < 4; i++)
  7. {
  8. cout << s1[i];
  9. }
  10. cout << endl;
  11. return 0;
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/468080
推荐阅读
相关标签
  

闽ICP备14008679号