35章 グローバルな演算子オーバーロード

http://www.geocities.jp/ky_webid/cpp/language/035.html

演算子オーバーロードはクラスのメンバ関数単位だけでなく、グローバルな演算子に対しても行えます。

その例としてstd::coutの<<演算子に自作のクラスも受け付けてくれるようにオーバーロードしてみます。

まずはオーバーロードなしの場合の挙動を見てみます。

#include <iostream>
using namespace std;

class CSample {
public:
    CSample(int num) : m_num(num) {}
    int Get () const { return m_num; }
private:
    int m_num;
};

int main() {
    CSample obj(200);
    
    cout << obj << endl;
    return 0;
}

これをコンパイルするとエラーが出まくります。objに対して<<演算子を適応した場合の振る舞いが不定だからです。

そこでグローバルな<<演算子をオーバーライドしてみます。

#include <iostream>
using namespace std;

class CSample {
public:
    CSample(int num) : m_num(num) {}
    int Get () const { return m_num; }
private:
    int m_num;
};

ostream& operator<<(ostream& os,const CSample& obj) {
    return os << obj.Get();
}

int main() {
    CSample obj(200);
    
    cout << obj << endl;
    return 0;
}
$ main
200

これでうまく行きました。

ですが基本的にはクラスで演算子オーバーロードで実現できるならそれを使った方が良いと思います。