# C++运算符重载(简单易懂)

++、--、>>、<<等，这样，你就能使用自定义类型的运算符。

## 运算符重载的基本格式

Point operator+(const Point &);

## 类内重载

#include <iostream>
using namespace std;

class Point{
public:
Point(){};
Point (int x, int y): x(x),y(y) {};
Point operator+(const Point &a){ //类内重载，运算符重载函数作为类的成员函数
Point ret;
ret.x = this->x + a.x;
ret.y = this->y + a.y;
return ret;
}
int x,y;
};

int main() {
Point a(2,4),b(5,3);
Point c = a + b;
cout<< "x :" << c.x << endl;
cout<<"y :" << c.y << endl;
}


x : 7

y: 7

## 类外重载

#include <iostream>
using namespace std;

class Point{
public:
Point(){};
Point (int x, int y): x(x),y(y) {};
friend Point operator+(const Point &, const Point &);
int x,y;
};

Point operator+(const Point &a,const Point &b){//类外重载,运算符重载函数作为类的友元函数
Point ret;
ret.x = a.x + b.x;
ret.y = a.y + b.y;
return ret;
}

int main() {
Point a(2,4),b(5,3);
Point c = a + b;
cout<< "x :" << c.x << endl;
cout<<"y :" << c.y << endl;
}


## 各种运算符重载实例

### 插入运算符重载>> and 提取运算符重载<<

#include <iostream>
using namespace std;

class Point{
public:
Point(){};
Point (int x, int y): x(x),y(y) {};
friend Point operator+(const Point &, const Point &);
friend ostream &operator<<(ostream &out , const Point &a);
private:
int x,y;
};

Point operator+(const Point &a,const Point &b){
Point ret;
ret.x = a.x + b.x;
ret.y = a.y + b.y;
return ret;
}

ostream &operator<<(ostream &out , const Point &a){
out << "<Point>( " << a.x << ", " << a.y << ")";
return out;
}

int main() {
Point a(2,4),b(5,3);
Point c = a + b;
cout << c<< endl;
}


< Point>( 7, 7)

### 前置运算符重载++ and 后置运算符重载++

 #include <iostream>
using namespace std;

class Point{
public:
Point(){};
Point (int x, int y): x(x),y(y) {};
friend Point operator+(const Point &, const Point &);
friend ostream &operator<<(ostream &out , const Point &a);
Point& operator++(){ //前置运算符，需要引用返回，不需要参数。返回自增后的值，且返回的是一个左值
x++;
y++;
return *this;
}

const Point operator++(int){//后置++，不需要引用返回，需要参数区分。返回自增前的值，且返回的是一个右值
Point temp(x,y);
x++;
y++;
return temp;
}
private:
int x,y;
};

Point operator+(const Point &a,const Point &b){
Point ret;
ret.x = a.x + b.x;
ret.y = a.y + b.y;
return ret;
}

ostream &operator<<(ostream &out , const Point &a){
out << "<Point>(" << a.x << " , " << a.y << ")";
return out;
}

int main() {
Point a(2,4),b(5,3);
Point c = a + b;
cout << c << endl;
c++;
cout << c << endl;
++c;
cout << c << endl;
}


(7 , 7)
< Point>(8 , 8)
< Point>(9 , 9)

1>为区别前置和后置运算符，需要在后置运算符重载函数中加参数“int”，虽然这个类型在此除了以示区别之外并不代表任何实际含义；

2>前置返回的是变量的引用，后置返回的是常量。所以++++c合法，而c++++不合法;

3>为什么不让c++++也合法呢？如果要实现c++++合法，必须使后置返回变量或变量的引用。c++是先返回c值再+1，所以不可能返回c，那就只能先建立局部变量来保存c的初值，然后再返回局部变量（局部变量不允许返回引用），但返回了局部变量之后，如果再连着进行下一次++运算，参与运算的就是这个局部变量的值了，所以此时c++++其实等效与c++，也就没有存在的意义了。

posted on 2020-03-21 12:43  翻身咸鱼ing  阅读(15284)  评论(0编辑  收藏  举报