C++---运算符重载(1)

Carmen ·
更新时间:2024-09-20
· 892 次阅读

运算符重载功能很强大,可以方便很多操作
这些简单看一下它都有哪些用法:
比如,当我们要对两个字符串直接拼接在一起的时候,通常我们利用append()函数,
那能不能简单地直接用+号连接呢,类似于下面

’ + ’ 号重载 string a = "Hello "; string b = "World"; cout<< a + b << endl;

如果直接这样用,那肯定是会报错的
这时候,我们可以重载+号运算符实现直接加起来的效果

#include #include using namespace std; string operator+(string a,string b)//这里对+号运算符进行重载 { string tmp; tmp = a.append(b); //内部使用append()函数实现两个字符串拼接 return tmp; //返回一个拼接后的string } int main() { string a = "Hello "; string b = "World"; cout<< a + b << endl; }

又或者,我们想让我们自定义的类型进行相加,比如结构体,
我们想要实现两个结构体钟的某个成员相加,
同样也可以利用重载+号运算符来达到目的

#include #include using namespace std; //定义一个结构体 struct competitor{ string name; int sport_score; }; //重载+号运算符 int operator+(competitor a,competitor b) { int tmp; tmp = a.sport_score + b.sport_score; return tmp; } int main() { competitor A = {"tom",90}; competitor B = {"jack",89}; competitor C = {"Duncan",79}; C.sport_score = A + B;//这里直接就可以两个结构体相加 cout<<C.sport_score<<endl; return 0; }

又或者其他,我们想让两个类中的某个属性相加,也可以重载+号运算符来达到目的

’ << ’ 重载

这里我们希望输出类的某个属性的时候,通过直接输出类对象名直接输出这个属性

#include #include using namespace std; class Dog{ friend ostream & operator<<(ostream &cout, Dog &a);//使用友元,让运算符可以访问类的私有成员 public: Dog(string col, int h)//定义构造函数初始化类属性 { color = col; height = h; } private: string color; int height; }; //使用全局函数重载,而不使用类的成员函数去重载 ostream & operator<<(ostream &cout, Dog &a) { cout << a.color ; cout << a.height ; return cout; } int main() { Dog B("white",50); cout << B << endl; return 0; }

返回值为ostream流类型,不会影响后续正常操作,有一种链式编程思想,
这里不是很懂,搞懂了会再说说链式编程思想

其中一些细节问题:在重载<<的时候,不应该在里面输出换行符,也是为了不影响后续操作,让用户在正常使用<<的时候有权控制更多的输出细节

其中,为什么要使用全局函数重载输出运算符
如果我们使用成员函数去重载输出运算符
会出现

class Harsh{ //这里重载了<<运算符 } //想要输出的时候,就会变成 Harsh A; A << cout;

cout在右边,会不会很奇怪。
在C++Primer里面有写:假设输入输出运算符是某个类的成员,则它们也必须是istream或ostream的成员。然而,这两个类属于标准库,并且我们无法给标准库中的类添加任何成员。因此,如果我们希望为类自定义IO运算符,则必须将其定义成非成员函数。当然,IO运算符通常需要读写类的非公有数据成员,所以IO运算符一般被声明为友元。


作者:冲啊_chonga_冲啊



重载 运算符 运算符重载 C++ c+

需要 登录 后方可回复, 如果你还没有账号请 注册新账号