[C++] 演算子のオーバーロード

– 演算子について新しい用法を定義することを演算子のオーバーロード(operator overloading)と言う
戻り値の型 operator 演算子(引数);

– 演算子の左オペランドがそのクラス以外の値を使うことをfriendをつけたfriend functionという

– 単項演算子をオーバーロードする
戻り値の型 operator 演算子();

class Point {
    private:
        int x;
        int y;
    public:
        Point(int a = 0, int b = 0) {x= a; y = b;}
        void setX(int a) {x=a;}
        void setY(int b) {y=b;}
        void show() {cout << " x:" << x << " y:" << y << '\n';}
        Point operator++();
        Point operator++(int d);
        friend Point operator+(Point p1, Point p2);
        friend Point operator+(Point p, int a);
        friend Point operator+(int a, Point p);
};

Point Point::operator++(){
    x++;
    y++;
    return *this;
}

Point Point::operator++(int d){
    Point p = *this;
    x++;
    y++;
    return p;
}

Point operator+(Point p1, Point p2){
    Point tmp;
    tmp.x = p1.x + p2.x;
    tmp.y = p1.y + p2.y;
    return tmp;
}
Point operator+(Point p, int a){
    Point tmp;
    tmp.x = p.x + a;
    tmp.y = p.y + a;
    return tmp;
}

Point operator+(int a, Point p) {
    Point tmp;
    tmp.x = a + p.x;
    tmp.y = a + p.y;
    return tmp;
}

int main() {
    Point p1(1, 2);
    Point p2(3, 6);
    p1 = p1+p2;
    p1++;
    p1 = p1 + 3;
    p2 = 3 + p2;

    p1.show();
    p2.show();

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
x:8 y:12
x:6 y:9