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类的时候常常可以看到下面这种写法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值