logo

C++ の Friend クラスと関数

フレンドクラス フレンドとして宣言されている他のクラスのプライベートおよび保護されたメンバーにアクセスできます。特定のクラスが他のクラスのプライベート メンバーや保護されたメンバーにアクセスできるようにすると便利な場合があります。たとえば、LinkedList クラスは、Node.js のプライベート メンバーへのアクセスを許可される場合があります。

BFS検索

C++ でフレンド クラスを宣言するには、 友人 キーワード。



構文:

friend class class_name; // declared in the base class>

フレンドクラス


例:



C++
// C++ Program to demonstrate the // functioning of a friend class #include  using namespace std; class GFG { private:  int private_variable; protected:  int protected_variable; public:  GFG()  {  private_variable = 10;  protected_variable = 99;  }  // friend class declaration  friend class F; }; // Here, class F is declared as a // friend inside class GFG. Therefore, // F is a friend of class GFG. Class F // can access the private members of // class GFG. class F { public:  void display(GFG& t)  {  cout << 'The value of Private Variable = '  << t.private_variable << endl;  cout << 'The value of Protected Variable = '  << t.protected_variable;  } }; // Driver code int main() {  GFG g;  F fri;  fri.display(g);  return 0; }>

出力
The value of Private Variable = 10 The value of Protected Variable = 99>

注記: フレンド クラスや関数は、プライベート ブロック、プロテクト ブロック、パブリック ブロックのいずれであっても、基本クラス本体のどこにでも宣言できます。すべて同じように機能します。

フレンド機能

フレンド クラスと同様に、フレンド関数には、C++ のクラスのプライベート メンバーと保護されたメンバーへの特別なアクセスを許可できます。これらはクラスのメンバー関数ではありませんが、フレンドとして宣言されているため、そのクラスのプライベートおよび保護されたメンバーにアクセスして操作できます。

フレンド機能には次のようなものがあります。



配列Javaをソートする
  1. グローバル関数
  2. 別のクラスのメンバー関数
C++ の Friend 関数と例

C++ のフレンド関数

Javaがnullです

構文:

friend return_type function_name (arguments); // for a global function  or friend return_type class_name::function_name (arguments); // for a member function of another class>
フレンド関数の構文

フレンド関数の構文

1. フレンド機能としてのグローバル機能

任意のグローバル関数をフレンド関数として宣言できます。次の例は、C++ でグローバル関数をフレンド関数として宣言する方法を示しています。

例:

C++
// C++ program to create a global function as a friend // function of some class #include  using namespace std; class base { private:  int private_variable; protected:  int protected_variable; public:  base()  {  private_variable = 10;  protected_variable = 99;  }    // friend function declaration  friend void friendFunction(base& obj); }; // friend function definition void friendFunction(base& obj) {  cout << 'Private Variable: ' << obj.private_variable  << endl;  cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() {  base object1;  friendFunction(object1);  return 0; }>

出力
Private Variable: 10 Protected Variable: 99>

上記の例では、フレンド関数としてグローバル関数を使用しています。次の例では、別のクラスのメンバー関数をフレンド関数として使用します。

2. フレンド機能としての別クラスのメンバ機能

C++ では、別のクラスのメンバー関数をフレンド関数として宣言することもできます。次の例は、C++ で別のクラスのメンバー関数をフレンド関数として使用する方法を示しています。

例:

10/10
C++
// C++ program to create a member function of another class // as a friend function #include  using namespace std; class base; // forward definition needed // another class in which function is declared class anotherClass { public:  void memberFunction(base& obj); }; // base class for which friend is declared class base { private:  int private_variable; protected:  int protected_variable; public:  base()  {  private_variable = 10;  protected_variable = 99;  }  // friend function declaration  friend void anotherClass::memberFunction(base&); }; // friend function definition void anotherClass::memberFunction(base& obj) {  cout << 'Private Variable: ' << obj.private_variable  << endl;  cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() {  base object1;  anotherClass object2;  object2.memberFunction(object1);  return 0; }>

出力
Private Variable: 10 Protected Variable: 99>

注記 : 別のクラスのフレンド関数を定義する順序は重要であり、注意する必要があります。関数を定義する前に、常に両方のクラスを定義する必要があります。そのため、クラス外のメンバー関数定義を使用しました。

フレンド機能の特徴

  • フレンド関数は C++ の特別な関数であり、クラスのメンバー関数ではないにもかかわらず、次のような特権を持っています。 アクセス プライベートで保護されたデータ クラスの。
  • フレンド関数は、クラスの非メンバー関数または通常の関数であり、キーワードを使用してフレンドとして宣言されます。 友人 クラスの中で。関数をフレンドとして宣言すると、その関数にすべてのアクセス権限が与えられます。
  • キーワード friends は、friend 関数の関数宣言内にのみ配置され、 ない の中に 関数の定義または呼び出し。
  • フレンド関数は通常の関数と同じように呼び出されます。オブジェクト名とドット演算子を使用して呼び出すことはできません。ただし、アクセスしたい値を持つオブジェクトを引数として受け入れる場合があります。
  • フレンド関数は、クラスの任意のセクション (public、private、または protected) で宣言できます。

以下に、さまざまなシナリオにおけるフレンド機能の例をいくつか示します。

複数のクラスに優しい関数

C++
// C++ Program to demonstrate  // how friend functions work as // a bridge between the classes #include  using namespace std; // Forward declaration class ABC;  class XYZ {  int x; public:  void set_data(int a)   {   x = a;   }  friend void max(XYZ, ABC); }; class ABC {  int y; public:  void set_data(int a)   {   y = a;   }  friend void max(XYZ, ABC); }; void max(XYZ t1, ABC t2) {  if (t1.x>t2.y) cout<< t1.x;  else  cout << t2.y; } // Driver code int main() {  ABC _abc;  XYZ _xyz;  _xyz.set_data(20);  _abc.set_data(35);  // calling friend function  max(_xyz, _abc);   return 0; }>

出力
35>

フレンド機能は個人データにアクセスする方法を提供しますが、デメリットもあります。以下は、C++ のフレンド関数の長所と短所のリストです。

フレンド機能のメリット

  • フレンド関数は、クラスを継承せずにメンバーにアクセスできます。
  • フレンド機能は、プライベート データにアクセスすることにより、2 つのクラス間のブリッジとして機能します。
  • これを使用して、オーバーロードされた演算子の汎用性を高めることができます。
  • これは、クラスのパブリック部分、プライベート部分、または保護された部分のいずれかで宣言できます。

フレンド機能のデメリット

  • フレンド関数は、クラスの外部からクラスのプライベート メンバーにアクセスできますが、これはデータ隠蔽の法則に違反します。
  • フレンド関数は、そのメンバー内で実行時のポリモーフィズムを実行できません。

フレンド機能とクラスについての注意点

  1. 友達は限られた目的でのみ使用されるべきです。保護されたデータ アクセスまたはプライベート データ アクセスを持つクラスのフレンドとして宣言されている関数または外部クラスが多すぎると、オブジェクト指向プログラミングで個別のクラスをカプセル化する価値が低下します。
  2. 友情というのは 相互ではない 。クラス A が B の友達である場合、B は自動的に A の友達にはなりません。
  3. 友情は継承されません。 (見る これ 詳細については)
  4. 友達という概念は Java にはありません。