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

本文详细介绍了C++中string类的运算符重载,包括+=用于字符串拼接、=进行内容替换、>比较字符串大小以及[]访问/修改字符。通过实例演示了如何实现这些运算符背后的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

类成员函数学习——隐藏的this指针 + const修饰类成员函数_abs(ln(1+NaN))的博客-优快云博客不同对象调用同一个函数,那么这个函数是如何区分不同对象的呢??https://blog.youkuaiyun.com/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))的博客-优快云博客https://blog.youkuaiyun.com/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;
}

### C++ STL 模板与运算符重载 #### 函数调用运算符(`()`)重载示例 在C++中,可以通过定义成员函数 `operator()` 来实现对函数调用运算符重载。这使得对象能够像函数一样被调用。 ```cpp #include<iostream> using namespace std; class CStudent { public: void operator()(string str) { // 重载()运算符 cout << "重载函数:" << str << endl; } }; int main() { CStudent s; s("我是一只小菜鸟。"); // 使用重载的括号运算符 } ``` 上述代码展示了如何创建一个名为 `CStudent` 的并在此内部定义了一个接受字符串参数的方法来模拟函数行为[^2]。 #### 赋值运算符重载于STL容器间的数据传递 对于标准模板库(STL),赋值运算符(`=`)扮演着重要角色,在不同实例之间传输数据时尤为有用。当两个相同型的容器相连接时——比如从一个向量(vector)复制到另一个同型的新建vector——编译器会自动调用该特定型的默认赋值操作[^3]。 ```cpp #include<vector> void copyContainer(const vector<int>& source, vector<int>& destination){ destination = source; // 利用了内置的赋值运算符来进行深拷贝 } // 或者更复杂的情况如下所示: template<typename T> T& assignValue(T& lhs, const T& rhs){ if(&lhs != &rhs){ // 防止自赋值 lhs = rhs; } return lhs; } ``` 这里不仅简单地实现了基本数值间的赋值逻辑,还考虑到了防止自我赋值的安全措施;而针对STL容器,则直接利用其内建机制完成高效且安全的对象状态转移过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值