クラスのフレンド
クラス:インデックス への移動
クラス X の friend F は,X のメンバー関数ではありませんが,X の private および protected メンバーへのフルアクセス権を持つ関数あるいはクラスです。スコープ,宣言,定義などほかの点については,F は通常の関数です。
F は X のメンバーではないので,F は X のスコープ内にはなく,また x.F と xptr->F 選択演算子で呼び出すことはできません(x は X のオブジェクト,xptr は X オブジェクトを指すポインタ)。
指定子 friend が,クラス X 内の関数宣言あるいは関数定義で使用された場合,それは X のフレンドになります。
あるクラス内で定義されるフレンド関数は,メンバー関数と同じインライン規則に従います(インライン関数を参照)。フレンド関数は,そのクラス内での位置,およびアクセス指定子には影響を受けません。次に例を示します。
class X {
int i; // X に private
friend void friend_func(X*, int);
/* friend_func は,private セクションで宣言されていても private ではない */
public:
void member_func(int);
};
/* 定義。両関数とも private の int i にアクセスする */
void friend_func(X* xptr, int a) { xptr->i = a; }
void X::member_func(int a) { i = a; }
X xobj;
/* 関数呼び出しにおける違いに注意 */
friend_func(&xobj, 6);
xobj.member_func(6);
クラス Y のすべての関数を,1 つの宣言でクラス X のフレンド関数にすることができます。
class Y; // 不完全宣言
class X {
friend Y;
int i;
void member_funcX();
};
class Y; { // 宣言を完了する
void friend_X1(X&);
void friend_X2(X*);
.
.
.
};
friend 指定子はありませんが,Y の中で宣言された関数は X のフレンドです。これらの関数は,i や member_funcX などの,X の private メンバーにアクセスできます。
クラス X の個々のメンバー関数がクラス Y のフレンドになることも可能です。
class X {
.
.
.
void member_funcX();
}
class Y {
int i;
friend void X::member_funcX();
.
.
.
};
クラスのフレンド属性は連結されるものではありません。たとえば,X が Y のフレンドであり,Y が Z のフレンドであっても,X は(そのままでは)Z のフレンドにはなりません。フレンド属性は継承されません。