logo

Třída a funkce přátel v C++

A třída přátel má přístup k soukromým a chráněným členům jiných tříd, ve kterých je deklarován jako přítel. Někdy je užitečné povolit určité třídě přístup k soukromým a chráněným členům jiných tříd. Například třídě LinkedList může být povolen přístup k soukromým členům Node.

Můžeme deklarovat třídu přátel v C++ pomocí přítel klíčové slovo.



Syntax:

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

Třída přátel


Příklad:



runas v powershell
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; }>

Výstup
The value of Private Variable = 10 The value of Protected Variable = 99>

Poznámka: Můžeme deklarovat třídu přátel nebo funkci kdekoli v těle základní třídy, ať už jde o soukromý, chráněný nebo veřejný blok. Funguje to úplně stejně.

Funkce přítele

Stejně jako třída přátel může být funkci přítele udělen speciální přístup k soukromým a chráněným členům třídy v C++. Nejsou členskými funkcemi třídy, ale mohou přistupovat k soukromým a chráněným členům této třídy a manipulovat s nimi, protože jsou deklarováni jako přátelé.

Funkce přítele může být:



  1. Globální funkce
  2. Členská funkce jiné třídy
Funkce Friend v C++ s příkladem

Funkce Friend v C++

Syntax:

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>
syntaxe funkce přítele

Syntaxe funkce přítele

1. Globální funkce jako funkce přítele

Jakoukoli globální funkci můžeme deklarovat jako funkci přítele. Následující příklad ukazuje, jak deklarovat globální funkci jako přátelskou funkci v C++:

Příklad:

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; }>

Výstup
Private Variable: 10 Protected Variable: 99>

Ve výše uvedeném příkladu jsme jako funkci přítele použili globální funkci. V dalším příkladu použijeme členskou funkci jiné třídy jako funkci přítele.

2. Členská funkce jiné třídy jako funkce přítele

Členskou funkci jiné třídy můžeme také deklarovat jako přátelskou funkci v C++. Následující příklad ukazuje, jak použít členskou funkci jiné třídy jako funkci přítele v C++:

Příklad:

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; }>

Výstup
Private Variable: 10 Protected Variable: 99>

Poznámka : Pořadí, ve kterém definujeme funkci přítele jiné třídy, je důležité a mělo by se o něj dbát. Před definicí funkce musíme vždy definovat obě třídy. Proto jsme použili definici členské funkce mimo třídy.

Vlastnosti funkcí přátel

  • Funkce přítele je speciální funkce v C++, ke které má oprávnění, přestože není členskou funkcí třídy přístup a soukromá a chráněná data třídy.
  • Funkce přítele je nečlenská funkce nebo běžná funkce třídy, která je deklarována jako přítel pomocí klíčového slova přítel uvnitř třídy. Deklarováním funkce jako přítele jsou funkci udělena všechna přístupová oprávnění.
  • Klíčové slovo přítel je umístěno pouze v deklaraci funkce funkce přítel a ne v definice funkce nebo volání.
  • Funkce přítele se nazývá jako běžná funkce. Nelze jej volat pomocí názvu objektu a operátoru tečky. Může však přijmout objekt jako argument, k jehož hodnotě chce získat přístup.
  • Funkce přítele může být deklarována v jakékoli části třídy, tj. veřejná nebo soukromá nebo chráněná.

Níže jsou uvedeny některé další příklady funkcí přátel v různých scénářích:

Funkce přátelská k více třídám

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; }>

Výstup
35>

Funkce přítel nám poskytuje způsob přístupu k soukromým údajům, ale má také své nevýhody. Níže je uveden seznam výhod a nevýhod funkcí přátel v C++:

Výhody funkcí přátel

  • Funkce přátel má přístup ke členům, aniž by bylo nutné zdědit třídu.
  • Funkce přítel funguje jako most mezi dvěma třídami tím, že přistupuje k jejich soukromým datům.
  • Lze jej použít ke zvýšení všestrannosti přetížených operátorů.
  • Může být deklarován buď ve veřejné, soukromé nebo chráněné části třídy.

Nevýhody funkcí přátel

  • Funkce přátel mají přístup k soukromým členům třídy mimo třídu, což porušuje zákon o skrývání dat.
  • Funkce přátel nemohou ve svých členech provádět žádný polymorfismus za běhu.

Důležité body o funkcích a třídách přátel

  1. Přátelé by se měli používat pouze pro omezené účely. Příliš mnoho funkcí nebo externích tříd je deklarováno jako přátelé třídy s chráněným nebo soukromým přístupem k datům, což snižuje hodnotu zapouzdření samostatných tříd v objektově orientovaném programování.
  2. Přátelství je ne vzájemné . Pokud je třída A přítelem B, pak se B automaticky nestává přítelem A.
  3. Přátelství se nedědí. (Vidět tento Více podrobností)
  4. Koncept přátel není v Javě.