友元friendまとめ


1.キーワードfriendはクラス定義の内部にのみ表示されます(constとは異なります)
2.友元は友元関係を付与するそのクラスのメンバーである
3.クラスBをクラスAの友元として定義し、BはAのプライベートメンバーにアクセスできる
 1:/*          ,  B->  A->  B*/  
class B;/*               ,      ,        */  
class A  
{  
private:  
    int x;  
public:  
    A(int i):x(i){}  
    friend B;/* B     ,B    A private*/  
};  
class B  
{  
private:  
    int x;  
public:  
    void Test(A a)  
    {  
        x = a.x;  
    }  
    int Get(){return x;}  
};  
int main()  
{  
    A a(3);  
    B b;  
    b.Test(a);  
    //  3.  Test()      ,   Test()  x B   ,    ,Test()   B    
    cout<<b.Get()<<endl;  
    return 0;  
}  

4.クラスBを定義するTest()関数はクラスAの友元であり、BのTest()関数はAのプライベートメンバーにアクセスできる
 2:/*          ,
  A->  B(                )->  A->  B   */
class A;/*               ,      ,        */
class B
{
private:
	int x;
public:
	void Test(A a);
	int Get(){return x;}
};
class A
{
private:
	int x;
public:
	A(int i):x(i){}
	friend void B::Test(A a);/* B Test()     ,B Test()    A private*/
};
void B::Test(A a){x = a.x;}
int main()
{
	A a(3);
	B b;
	b.Test(a);
	//  3.  Test()      ,   Test()  x B   ,    ,Test()   B 
	cout<<b.Get()<<endl;
	return 0;
}

5.友元宣言は、名前付きクラスまたは非メンバー関数を周辺の役割ドメインに導入します.さらに、友元関数はクラスの内部で定義することができ、この関数の役割ドメインはクラス定義を囲む役割ドメインに拡張される.
例3:
/*  A f()              。
     B       ,          B      */
class B
{
	friend class A;
	friend void f();
};
class C
{
public:
	A *p;
	void g(){return f();}
};
class A;
void f()
{
	cout<<"1"<<endl;
}
int main()
{
	C c;
	c.g();//  1
	return 0;
}

6.友元関数のリロード関数です.友元になるにはfriendで宣言する必要があります.
例4:
class A;/*               ,      ,        */
class B
{
private:
	int x;
public:
	void Test(A a);
	void Test(A a1, A a2);
	void Test(A a1, A a2, A a3);
	int Get(){return x;}
};
class A
{
private:
	int x;
public:
	A(int i):x(i){}
	friend void B::Test(A a);/* B Test()     ,B Test()    A private*/
	friend void B::Test(A a1, A a2);
};
//  ,          
void B::Test(A a){x = a.x;}
//  ,          
void B::Test(A a1, A a2){x = a1.x + a2.x;}
//  ,    Test(A a)   ,           
void B::Test(A a1, A a2, A a3){x = a1.x + a2.x + a3.x;}