操作符重载

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

 

posted on 2019-09-14 12:51  jianW1024  阅读(140)  评论(0编辑  收藏  举报

导航