演算子オーバーロード? 演算子オーバーライド?

会社でこれって間違いやすいよね、
結局どっちなの? みたいな感じで訊かれたりしたので、
実例を交えてエントリしてみる。


例として演算子+=を持ち出す。

class Foo {
public:
    Foo(int value) : value_(value) {
    }
    Foo& operator +=(const Foo& f) {
        value_ += f.value_;
        return *this;
    }
    int getValue() const {
        return value_;
    }
private:
    int value_;
};

というクラスがある。
+=演算子を定義してある。

    Foo f(100);
    
    f += Foo(1);
    
    f.operator+=(Foo(2));
    
    cout << f.getValue() << endl;

結果は103になる。
このように+=の実体はoperator+=(arg)に過ぎないということを忘れてはいけない。


本当の意味で+=などの演算子をオーバーライドすることはできない。
よって、クラスに対する+=などの演算子は常にオーバーロードになる。

    int i = 100;
    
    i += 1;
    
    i.operator+=(2);

また、このような書き方は赦されない。