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

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:

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ě.