C++友元関数友元クラス
友元関数は、クラスのプライベートメンバーに直接アクセスできる非メンバー関数です.これはクラス外に定義された一般的な関数で、クラスには属しませんが、クラスの定義で宣言する必要があります.宣言時に友元の名前の前にキーワードfriendを付けるだけで、そのフォーマットは以下の通りです.friendタイプの関数名(形式パラメータ);友元関数の宣言は、クラスのプライベート部分に置くことも、共通部分に置くこともできます.違いはありません.このクラスの友元関数であることを示しています.1つの関数は、複数のクラスのメタ関数であってもよく、各クラスで個別に宣言する必要があります.友元関数の呼び出しは一般関数の呼び出し方式と原理と一致する.
友元クラスのすべてのメンバー関数は、別のクラスの友元関数であり、プライベートメンバーと保護メンバーを含む別のクラスの非表示情報にアクセスできます.クラスが別のクラスのプライベートメンバーにアクセスできるようにする場合は、クラスを別のクラスの友元クラスとして宣言できます.友元クラスを定義する文のフォーマットは、friend classクラス名、ここで、friendとclassはキーワードであり、クラス名はプログラム内の定義済みクラスである必要があります.
以上の説明を経て、クラスBのすべてのメンバー関数はクラスAの友元関数であり、クラスAのプライベートメンバーにアクセスし、メンバーを保護することができる.
友元類を使用する際の注意:(1)友元関係は継承されない.(2)友元関係は一方向であり,交換性を持たない.クラスBがクラスAの友元であれば、クラスAは必ずしもクラスBの友元ではなく、クラスに相応の声明があるかどうかを見なければならない.(3)友元関係に伝達性がない.クラスBがクラスAの友元であれば、クラスCはBの友元であり、クラスCは必ずしもクラスAの友元ではない.同じようにクラスに相応の申明があるかどうかを見なければならない.
eg:クラスAとクラスBをそれぞれ定義し、それぞれ1つのプライベート整数メンバー変数が構造関数によって初期化される.クラスAには、AとBのプライベートメンバー変数を印刷するメンバー関数Show(B&b)があります.この機能は、それぞれ友元関数と友元クラスで実現してください.ユーティリティークラスとユーティリティー関数を使用して実装します.
:
友元クラスのすべてのメンバー関数は、別のクラスの友元関数であり、プライベートメンバーと保護メンバーを含む別のクラスの非表示情報にアクセスできます.クラスが別のクラスのプライベートメンバーにアクセスできるようにする場合は、クラスを別のクラスの友元クラスとして宣言できます.友元クラスを定義する文のフォーマットは、friend classクラス名、ここで、friendとclassはキーワードであり、クラス名はプログラム内の定義済みクラスである必要があります.
B A :
class A
{
…
public:
friend class B;
…
};
以上の説明を経て、クラスBのすべてのメンバー関数はクラスAの友元関数であり、クラスAのプライベートメンバーにアクセスし、メンバーを保護することができる.
友元類を使用する際の注意:(1)友元関係は継承されない.(2)友元関係は一方向であり,交換性を持たない.クラスBがクラスAの友元であれば、クラスAは必ずしもクラスBの友元ではなく、クラスに相応の声明があるかどうかを見なければならない.(3)友元関係に伝達性がない.クラスBがクラスAの友元であれば、クラスCはBの友元であり、クラスCは必ずしもクラスAの友元ではない.同じようにクラスに相応の申明があるかどうかを見なければならない.
eg:クラスAとクラスBをそれぞれ定義し、それぞれ1つのプライベート整数メンバー変数が構造関数によって初期化される.クラスAには、AとBのプライベートメンバー変数を印刷するメンバー関数Show(B&b)があります.この機能は、それぞれ友元関数と友元クラスで実現してください.ユーティリティークラスとユーティリティー関数を使用して実装します.
#include
using namespace std;
class B;
class A;
void Show( A& , B& );
class B
{
private:
int tt;
friend class A;
friend void Show( A& , B& );
public:
B( int temp = 100):tt ( temp ){}
};
class A
{
private:
int value;
friend void Show( A& , B& );
public:
A(int temp = 200 ):value ( temp ){}
void Show( B &b )
{
cout << value << endl;
cout << b.tt << endl;
}
};
void Show( A& a, B& b )
{
cout << a.value << endl;
cout << b .tt << endl;
}
int main()
{
A a;
B b;
a.Show( b );
Show( a, b );
return 0;
}