演算子のオーバーロードをフレンド関数に登録する

ロベールのC++入門講座 11-11

グローバルな演算子オーバーロードをするときに、その対象のクラスのプライベートな変数や関数が見えたほうが良いケースがあります。

そういう場合のために予めクラス側で対象となる演算子オーバーロードをフレンド関数に登録しておくと便利です。

class CSample {
    // グローバルな+演算子をフレンド関数登録しておく
    friend CSample operator+(int num,CSample& obj);
public:
    CSample () {
        m_num = 100;
    }
    CSample operator+(CSample& obj) {
        CSample ret;
        ret.m_num = this->m_num + obj.m_num;
        return ret;
    }
private:
    int m_num;
};


CSample operator+(int num,CSample& obj) {
    CSample ret;
    // フレンド関数登録されてるのでprivateなm_numに直接アクセスできる
    ret.m_num = obj.m_num + num;
    return ret;
}

あまり意味のない例ですが、雰囲気としてはこんな感じです。

こういうケースなら確かにfriendが役に立つのかもしれませんね。