PMPの流儀

我が家の流儀

我が家で気になったことを夫婦で取り上げていきます

MENU

C++演算子オーバーロードのサンプル

C++ 演算子オーバーロードのサンプルを紹介します

double 型のラッパークラスとして Double 型を作成します。 なるべく標準型の演算子と同じ意味になるようにするのと、コールコストを減らすためにきめ細かいメンバー関数を準備することが必要になります。

class Double
{
    double val;
public:
    Double() {} 
    Double(double n) : val(n) {}
    Double(const Double& n) : val(n.val) {}

    Double& operator=(const Double& n) { this->val = n.val; return *this; }
    Double& operator+=(const Double& n) { this->val += n.val; return *this; }
    Double& operator-=(const Double& n) { this->val -= n.val; return *this; }
    Double& operator*=(const Double& n) { this->val *= n.val; return *this; }
    Double& operator/=(const Double& n) { this->val /= n.val; return *this; }

    Double operator++() { return Double(++this->val); }
    Double operator++(int) { return Double(this->val++); }

    friend Double operator+(const Double& lhs, const Double& rhs) { return Double(lhs.val + rhs.val); }
    friend Double operator-(const Double& lhs, const Double& rhs) { return Double(lhs.val - rhs.val); }
    friend Double operator*(const Double& lhs, const Double& rhs) { return Double(lhs.val * rhs.val); }
    friend Double operator/(const Double& lhs, const Double& rhs) { return Double(lhs.val / rhs.val); }

    friend int operator==(const Double& lhs, const Double& rhs) { return lhs.val == rhs.val; }
    friend int operator!=(const Double& lhs, const Double& rhs) { return lhs.val != rhs.val; }
};

コンストラク

コロン':'を使った初期化子でメンバー変数を初期化します。

1項演算子

引数が const Double& x なのは、無駄なコンストラクタが発生しないように参照渡しでオブジェクトを引数にします。 戻り値が Double& なのは、x = y = z; のような使い方の場合を想定しています。今回の場合だと x.operator=( y.operator=(z)); というコール関係になり、y.opertor=(z) が、y自身を返さないと成立しません。

2項演算子

2項演算子はメンバー関数ではありません。引数の2つのDouble型のオブジェクトを取り扱います。そのためfriend指定しています。

比較演算子

2項演算子と同じで friend 指定します。

※ friend のところは static にしても良いです。