フレンド演算子関数


グローバルな演算子関数

演算子のオーバーロードにフレンド関数を用いることもできます
フレンド関数を用いることで、グローバルな演算子関数を表現できます

フレンド関数を用いるに当たり、最も重要な機能は
メンバ関数と異なり、明示的にオブジェクトを受け取るという点です
フレンド関数に 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);

上が前置き、下が後置きの演算子関数です



前のページへ戻る次のページへ