前のページ(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
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/269