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

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

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

#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

日時: 2008年06月16日 15:42
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/269

この記事にトラックバックされる方は、参照先が分かるようにするために、「グローバル関数で演算子のオーバーロード」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - C言語とC++勉強ルーム