クラスのフレンド

提供: Appmethod Topics
移動先: 案内検索

クラス:インデックス への移動

クラス 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 のフレンドにはなりません。フレンド属性は継承されません。

関連項目