重载运算符
运算符重载本质是调用函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | #include <iostream>#include <cstring>
 using namespace std;
 
 class Point {
 friend Point operator + (Point, Point);
 int m_x;
 int m_y;
 public:
 Point(int x, int y) : m_x(x), m_y(y) {};
 void display() {
 cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
 }
 };
 
 Point operator + (Point p1, Point p2) {
 cout << "**" << endl;
 return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
 }
 
 int main() {
 Point p1(10, 20);
 Point p2(20, 30);
 p1.display();
 
 Point p3 = p1 + p2;
 
 p3.display();
 return 0;
 }
 
 | 
进一步完善
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | class Point {friend Point operator + (const Point&, const Point&);
 int m_x;
 int m_y;
 public:
 Point(int x, int y) : m_x(x), m_y(y) {};
 void display() {
 cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
 }
 Point(const Point& point) {
 m_x = point.m_x;
 m_y = point.m_y;
 }
 };
 
 Point operator + (const Point &p1, const Point &p2) {
 return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
 }
 
 | 
利用成员函数实现运算符重载
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | #include <iostream>using namespace std;
 
 class Point {
 
 int m_x, m_y;
 public:
 Point(int x, int y) : m_x(x), m_y(y) {};
 void display() {
 cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
 }
 Point(const Point& point) {
 m_x = point.m_x;
 m_y = point.m_y;
 }
 Point operator + (const Point &point) {
 return Point(this->m_x+point.m_x, this->m_y+point.m_y);
 }
 };
 
 
 
 int main() {
 Point p1(10, 20);
 Point p2(20, 30);
 Point p3(30,  40);
 Point p4 = p1 + p2 + p3;
 p4.display();
 
 return 0;
 }
 
 | 
不能给临时值赋值 的实现方法
可以通过在返回值类型前加const就可实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | #include <iostream>using namespace std;
 
 class Point {
 
 int m_x, m_y;
 public:
 Point(int x, int y) : m_x(x), m_y(y) {};
 void display() {
 cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
 }
 Point(const Point& point) {
 m_x = point.m_x;
 m_y = point.m_y;
 }
 const Point operator + (const Point &point) {
 return Point(this->m_x+point.m_x, this->m_y+point.m_y);
 }
 const Point operator - (const Point& point) {
 return Point(this->m_x - point.m_x, this->m_y - point.m_y);
 }
 };
 
 
 
 int main() {
 Point p1(10, 20);
 Point p2(20, 30);
 Point p3(30,  40);
 Point p4 = p1 + p2 + p3;
 p4.display();
 p4 = p2 - p1;
 p4.display();
 (p1 + p2) = p3;
 
 return 0;
 }
 
 | 
但是这样又存在一个问题
因为 const对象 不能调用 非const函数
| 12
 
 | Point p4 = p1 + p2 + p3; 
 
 | 
将代码修改这样即可
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | #include <iostream>using namespace std;
 
 class Point {
 
 int m_x, m_y;
 public:
 Point(int x, int y) : m_x(x), m_y(y) {};
 void display() {
 cout << "(" << this->m_x << ", " << this->m_y << ")" << endl;
 }
 Point(const Point& point) {
 m_x = point.m_x;
 m_y = point.m_y;
 }
 const Point operator + (const Point &point) const {
 return Point(this->m_x+point.m_x, this->m_y+point.m_y);
 }
 const Point operator - (const Point& point) const  {
 return Point(this->m_x - point.m_x, this->m_y - point.m_y);
 }
 };
 
 
 
 int main() {
 Point p1(10, 20);
 Point p2(20, 30);
 Point p3(30,  40);
 Point p4 = p1 + p2 + p3;
 p4.display();
 p4 = p2 - p1;
 p4.display();
 
 
 return 0;
 }
 
 | 
+= 重载运算符
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | ......Point & operator += (const Point& point) {
 m_x += point.m_x;
 m_y += point.m_y;
 return *this;
 }
 ..........
 
 (p1 += p2) = Point(2, 3);
 p1.display();
 
 | 
== != 重载运算符
| 12
 3
 4
 5
 6
 
 | bool operator == (const Point& point) {return (m_x == point.m_x && m_y == point.m_y);
 }
 bool operator != (const Point& point) {
 return (m_x != point.m_x ||  m_y != point.m_y);
 }
 
 |