網頁

2022/8/8

C++ 類別的運算子多載 class operator overloading

運算子多載(operator overloading)為自訂運算子如+-*/><==等的作用。


運算子可直接在原始數字型別如intdouble等作用,例如+為前運算元加後運算元;-為前運算元減後運算元。

main.cpp

#include <iostream>
using namespace std;

int main() {
    int a = 1;
    int b = 2;
    cout << a + b << endl; // 3
    cout << a - b << endl; // -1

    return 0;
}

但對自訂型別如類別若要以運算子計算則必須實作運算子的功能,此即為運算子多載。運算子多載是透過多載operator關鍵字後接運算子的函式/方法來實現。

例如下面對類別Point+-做運算子多載,如此Point物件即可以+-做運算。

main.cpp

#include <iostream>
#include <string>
using namespace std;

class Point {
    private:
        int x;
        int y;

    public:
        Point(int x, int y) : x{x}, y{y} {};

        // operator '+' overloading
        Point operator+(const Point& pr) { return {x + pr.x, y + pr.y}; }
        // operator '-' overloading (prototype)
        Point operator-(const Point& pr);

        int GetX() { return x; }
        int GetY() { return y; }
};

// operator '-' overloading (body)
Point Point::operator-(const Point& pr) { return {x - pr.x, y - pr.y}; }

int main() {
    Point p1 = {1, 2};
    Point p2 = {3, 4};

    Point p3 = p1 + p2; // call overloaded operator '+'

    cout << to_string(p3.GetX()) << endl; // 4
    cout << to_string(p3.GetY()) << endl; // 6

    Point p4 = p2 - p1;
    cout << to_string(p4.GetX()) << endl; // 2
    cout << to_string(p4.GetY()) << endl; // 2

    return 0;
}


沒有留言:

張貼留言