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

演算子の多重定義(オーバーロード: Overload)

operatorについて

C++では演算子の動作は「演算子関数」で定義されるため、演算子の多重定義が可能となります。

演算子のオーバーロードには「operator」キーワードを用います。


戻り値の型 operator オーバーロードする演算子 ( parameter-list )

例えば、「A+B」は「A.operator+(B)」という演算子になります。

さらに、フレンド関数を利用すれば「operator+(A,B)」と表現することができます。


単項演算子のオーバーロード

単項演算子のオーバーロードは、単項演算子の右辺にあるオブジェクトが引数として渡されます。

例えば、「obj1 = obj2;」という式の「=」をオーバーロードした時は、「obj1.=(obj2);」という意味になります。


#include <iostream>
using namespace std;

//単項演算子のオーバーロード
class Overload{
private:
    int buff_;
public:
    Overload(int data) :buff_(data){};  // コンストラクタ
    ~Overload(){};                        // デストラクタ
    int print(){ return(buff_); }

    // 代入
    Overload& operator=(const Overload &obj)
    {
        buff_ = obj.buff_;
        return(*this);
    }

    // インクリメント
    void operator++(int)
    {
        buff_++;
        return;
    }

    // デクリメント
    void operator--()
    {
        --buff_;
        return;
    }
};

int main()
{
    Overload obj1(5);
    Overload obj2(7);

    obj1 = obj2;
    cout << "=  : " << obj1.print() << endl;

    obj1++;
    cout << "++ : " << obj1.print() << endl;

    --obj1;
    cout << "-- : " << obj1.print() << endl;

    return(0);
}

2項演算子のオーバーロード

2項演算子のオーバーロードは、演算子の右辺が引数として渡され、左辺オブジェクトのオーバーロードした演算子が呼び出されます。


#include <iostream>
using namespace std;

class Overload
{
private:
    int buff;
public:
    Overload(int data) :buff(data) {};
    ~Overload(){};
    int print(){ return(buff); }

    //2項演算子のオーバーロード
    int operator+(const Overload &obj){
        return(buff + obj.buff);
    }
    int operator-(const Overload &obj){
        return(buff - obj.buff);
    }
    int operator*(const Overload &obj){
        return(buff * obj.buff);
    }
    int operator/(const Overload &obj){
        return(buff / obj.buff);
    }
    int operator%(const Overload &obj){
        return(buff % obj.buff);
    }
};

int main(int argc, char** argv)
{
    int data = 0;
    Overload obj1(17);
    Overload obj2(5);

    data = obj1 + obj2; 
    cout << "data = " << data << endl;

    data = obj1 - obj2; 
    cout << "data = " << data << endl;

    data = obj1 * obj2;
    cout << "data = " << data << endl;

    data = obj1 / obj2;
    cout << "data = " << data << endl;

    data = obj1 % obj2;
    cout << "data = " << data << endl;

    return(0);
}

配列添え字演算子のオーバーロード

配列添え字である以下の表現は、


A[5]

オーバーロードすることで、以下の演算子関数として表現できます。


A.operator[](5);


関連ページ