フレンド演算子関数
グローバルな演算子関数
演算子のオーバーロードにフレンド関数を用いることもできます
フレンド関数を用いることで、グローバルな演算子関数を表現できます
フレンド関数を用いるに当たり、最も重要な機能は
メンバ関数と異なり、明示的にオブジェクトを受け取るという点です
フレンド関数に this ポインタが存在しないこと思い出してください
メンバ関数によるオーバーロードは、次のような演算ができませんでした
1000 + object;
メンバ演算子関数は、必ずオブジェクト型が左辺にくるという約束があったからです
しかし、フレンド演算子関数は双方を明示的に受け取るため
これに縛られることなく、比較的自由な演算を行うことができます
#include<iostream>
using namespace std;
class Integer {
public:
int value;
friend void operator +=(Integer &obj , int value);
friend void operator >>(int value , Integer &obj);
Integer() { value = 0; }
} obj ;
void operator +=(Integer &obj , int value) {
obj.value += value;
}
void operator >>(int value , Integer &obj) {
obj.value += value;
}
int main() {
obj += 10;
100 >> obj;
cout << obj.value;
return 0;
}
main() 関数で、 obj += 10 と 100 >> obj のオペランドに注目してください
フレンド関数では、このようにクラス型を右辺に指定した演算子のオーバーロードが可能です
ただし、フレンド演算子関数で代入演算子はオーバーロードできません
少なくとも、あなたがプログラマなら 10 = obj は奇妙に見えるでしょう
[]、()、-> 演算子も、同様にフレンド演算子関数にすることはできません
これらの演算子の本来の使われ方を考えれば、理由は想像できます
また、フレンド関数での単項演算子のオーバーロードも同じですが
インクリメントまたはデクリメントの、前置、後置の識別は次のようになります
type operator ++(Object &obj);
type operator ++(Object &obj , int n);
上が前置き、下が後置きの演算子関数です