グローバル関数で演算子のオーバーロード

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

前のページ(operatorキーワード・演算子(オペレーター)のオーバーロード)では、演算子のオーバーロードをクラスのメンバ関数として定義しました。
クラスではなく、グローバル関数としても、演算子のオーバーロードを定義できます。

スポンサーリンク

#include <iostream>
 
// 数字(整数)に100を足す + 演算子をオーバーロード定義
class opt_plus100 {
private:
    int number;        // 受け取る数字
 
public:
    // コンストラクタ
    opt_plus100(int num) {
        number = num;
    }
    
    // + 演算子のオーバーロードを宣言
    friend int operator +(opt_plus100&);
};
 
// 単項演算子 + を定義(オーバーロード)
int operator +(opt_plus100& obj) {
    return obj.number + 100;
}
 
int main() {
    opt_plus100 obj_p(42);                // オブジェクト生成(インスタンス化)
    int result = +obj_p;                // オーバーロードされた演算子を適用
    printf("result = %d\n", result);    // 結果の出力
    return 0;
}

今度は・・・

// 単項演算子 + を定義(オーバーロード)
int operator +(opt_plus100& obj) {
    return obj.number + 100;
}

と、演算子 + のオーバーロード定義をグローバル関数として定義しています。
グローバル関数として定義する場合は、注意点が2点あります。

1.関数定義のときに、引数はクラスオブジェクトを参照渡しにする。
2.クラス内の宣言では、friendキーワードを使用する。

演算子のオーバーロードを定義する場合には、引数をオブジェクトの参照渡しにする必要があります。
int型のみなどは、引数として渡すことができません。

上記の例ですと、クラス内のprivateの変数numberにアクセスする必要があるので、friendキーワードを付ける必要があります。
firiendがないと、コンパイルエラーとなります。
「’opt_plus100::number’ : private メンバ (クラス ‘opt_plus100′ で宣言されている) にアクセスできません。」
と、エラーが起こります。

実行結果。

result = 142
スポンサーリンク
 
スポンサーリンク