string类的模拟实现(五)—— 运算符重载

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

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

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

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

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

一、 运算符 +=

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

string s;
s += "abc";

运算符 += 可以把一个字符串拼接到当前字符串的末尾

我们直接使用前面 实现了的 push_back 函数和 append函数​​​​​​​string类的模拟实现(三)—— 插入字符/字符串_abs(ln(1+NaN))的博客-CSDN博客icon-default.png?t=M276https://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

string类的模拟实现(五)—— 运算符重载_第1张图片

 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;
}

string类的模拟实现(五)—— 运算符重载_第2张图片


三、运算符 >

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;
}

 

你可能感兴趣的:(C++,c++)