操作符重载
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) 运算符重载是对原有运算符进行适当的改造,功能应与原操作符相似,不能改变原操作符的对象个数,同时至少有一对象是自定义类型