运算符重载&模板写法

运算符重载写为成员函数还是全局函数的格式,取决于你所要达到的目的。

  重载为成员函数,那么该运算符的左边必须是某个类的对象实例。

  重载为全局函数,可以自定义该运算符的左边是什么东西,右边是什么东西。左边接受范围是第一个参数类型,右边接受范围是第二个参数类型。

 

 运算符重载的注意点:

  

一些常见的运算符重载模板:

#include <iostream>
using namespace std;

class Point {
    int x;
    int y;
public:
    Point(int x1 = 0, int y1 = 0) :x(x1), y(y1) {}
    Point(const Point& p) :x(p.x), y(p.y) {}
    
    // 输入输出运算符重载
    friend ostream& operator<<(ostream& output, const Point& p);
    friend istream& operator>>(istream& input, Point& p);
    
    // 第一个const保证了返回值不可被再次修改
    // 第三个const保证了const变量也能调用该操作符,也可保证成员变量不被修改
    const Point operator+ (const Point &p) const {
        return Point(x + p.x, y + p.y);
    }

    const Point operator- (const Point& p) const {
        return Point(x - p.x, y - p.y);
    }
    
    Point& operator+= (const Point& p) {
        x += p.x;
        y += p.y;
        return *this;
    }

    // 逻辑运算符
    bool operator== (const Point& p) const {
        return (x == p.x) && (y == p.y);
    }

    bool operator!= (const Point& p) {
        return (x != p.x) || (y != p.y);
    }

    // 负号,取反运算符
    const Point operator-() const {
        return Point(-x, -y);
    }

    //前置++
    Point& operator++() {
        x++;
        y++;
        return *this;
    }

    //后置++(括号内的int不可省略,不可更改)
    const Point operator++(int) {
        Point old = *this;
        x++;
        y++;
        return old;
    }
    
    void info() {
        cout << "(" << x << "," << y << ")" << endl;
    }
};

ostream& operator<<(ostream& output, const Point& p) {
    output << "(" << p.x << "," << p.y << ")";
    return output;
}

istream& operator>>(istream& input, Point& p) {
    input >> p.x >> p.y;
    return input;
}

int main() {

    Point p1(10, 20);
    Point p2(20, 30);
    Point p3;
    cout << p1 << endl;
    cin >> p3;
    cout << p3 << endl;

    return 0;
}

 

 

 

  

posted @ 2020-03-19 19:53  PrimaBruceXu  阅读(1207)  评论(0编辑  收藏  举报