C++中,不同类型的数据有很多的运算符,如加减乘除等。当我们在定义两个不同类结构体时,我们发现,两个对象之间是不能进行这些操作的,如:
#include<iostream>
using namespace std;
struct Point {
int x, y;
Point(int x = 0, int y = 0) :x(x), y(y) {};
};
ostream& operator << (ostream & out, const Point & p) {
out << "(" << p.x << "," << p.y << ")";
return out;
}
int main()
{
Point a, b(1, 2);
a.x = 3;
cout << a + b << "\n";
return 0;
}
运行结果:
所幸,C++允许用户把运算符添加到自己的类中,以方便运算
经过查阅我们发现,运算符重载分为重载为类的非成员函数与重载为成员函数,在此简略将其语法形式归为:
返回类型 operator 运算符(形参表)
{
函数体
}
那么放在本代码里就是:
1 //应添加
2 Point operator +(const Point& A ,const Point& B) {
3 return Point(A.x + B.x, A.y + B.y);
4 }
现在我们来对代码进行改正:
1 #include<iostream>
2 using namespace std;
3
4 struct Point {
5 int x, y;
6 Point(int x = 0, int y = 0) :x(x), y(y) {};
7 };
8
9 Point operator +(const Point& A ,const Point& B) {
10 return Point(A.x + B.x, A.y + B.y);
11 }
12 ostream& operator << (ostream& out, const Point& p) {
13 out << "(" << p.x << "," << p.y << ")";
14 return out;
15 }
16 int main()
17 {
18 Point a, b(1, 2);
19 a.x = 3;
20 cout << a + b << "\n";
21 return 0;
22 }
运行结果:

即实现了(1,2)和(3,0)相加
卡了卡了…
运算符重载的规则如下:
(1) C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已经有的运算符
(2) 重载之后运算符的优先级和结合性都不会改变
(3) 运算符重载是对原有运算符进行适当的改造,功能应与原操作符相似,不能改变原操作符的对象个数,同时至少有一对象是自定义类型