运算符重载功能很强大,可以方便很多操作
这些简单看一下它都有哪些用法:
比如,当我们要对两个字符串直接拼接在一起的时候,通常我们利用append()函数,
那能不能简单地直接用+号连接呢,类似于下面
’ + ’ 号重载
string a = "Hello ";
string b = "World";
cout<< a + b << endl;
如果直接这样用,那肯定是会报错的
这时候,我们可以重载+号运算符实现直接加起来的效果
#include <iostream>
#include <string>
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 <iostream>
#include <string>
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 <iostream>
#include <string>
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运算符一般被声明为友元。