Priateľská trieda a funkcia v C++

Priateľská trieda a funkcia v C++

A trieda priateľov má prístup k súkromným a chráneným členom iných tried, v ktorých je deklarovaný ako priateľ. Niekedy je užitočné povoliť určitej triede prístup k súkromným a chráneným členom iných tried. Napríklad triede LinkedList môže byť povolený prístup k súkromným členom Node.

Môžeme deklarovať priateľskú triedu v C++ pomocou priateľ kľúčové slovo.

Syntax:

friend class class_name; // declared in the base class 

Priateľská trieda


Prí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ýkon
The value of Private Variable = 10 The value of Protected Variable = 99 

Poznámka: Môžeme deklarovať priateľskú triedu alebo funkciu kdekoľvek v tele základnej triedy, či už ide o súkromný, chránený alebo verejný blok. Funguje to všetko rovnako.

Funkcia priateľa

Podobne ako trieda priateľov, aj funkcii priateľ môže byť udelený špeciálny prístup k súkromným a chráneným členom triedy v C++. Nie sú členskými funkciami triedy, ale môžu pristupovať k súkromným a chráneným členom tejto triedy a manipulovať s nimi, pretože sú deklarovaní ako priatelia.

Funkcia priateľa môže byť:

  1. Globálna funkcia
  2. Členská funkcia inej triedy
Funkcia priateľa v C++ s príkladom

Funkcia priateľa 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 
syntax funkcie priateľa

Syntax funkcie priateľa

1. Globálna funkcia ako funkcia priateľa

Za funkciu priateľa môžeme deklarovať akúkoľvek globálnu funkciu. Nasledujúci príklad ukazuje, ako deklarovať globálnu funkciu ako funkciu priateľa v C++:

Prí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ýkon
Private Variable: 10 Protected Variable: 99 

Vo vyššie uvedenom príklade sme použili globálnu funkciu ako funkciu priateľa. V ďalšom príklade použijeme členskú funkciu inej triedy ako funkciu priateľa.

2. Členská funkcia inej triedy ako funkcia priateľa

Členskú funkciu inej triedy môžeme deklarovať aj ako funkciu priateľa v C++. Nasledujúci príklad ukazuje, ako použiť členskú funkciu inej triedy ako funkciu priateľa v C++:

Prí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ýkon
Private Variable: 10 Protected Variable: 99 

Poznámka : Poradie, v ktorom definujeme funkciu priateľa inej triedy, je dôležité a malo by sa oň dbať. Pred definíciou funkcie musíme vždy definovať obe triedy. Preto sme použili definíciu funkcie člena mimo triedy.

Vlastnosti funkcií priateľov

  • Funkcia priateľa je špeciálna funkcia v C++, na ktorú má privilégium aj napriek tomu, že nie je členskou funkciou triedy prístup a súkromné ​​a chránené údaje triedy.
  • Priateľská funkcia je nečlenská funkcia alebo bežná funkcia triedy, ktorá je deklarovaná ako priateľ pomocou kľúčového slova priateľ vnútri triedy. Vyhlásením funkcie za priateľa sú funkcii udelené všetky prístupové povolenia.
  • Kľúčové slovo priateľ je umiestnené iba vo deklarácii funkcie funkcie priateľ a nie v definícia funkcie alebo volanie.
  • Funkcia priateľa sa nazýva ako bežná funkcia. Nedá sa volať pomocou názvu objektu a operátora bodky. Môže však prijať objekt ako argument, ktorého hodnotu chce získať.
  • Funkcia priateľa môže byť deklarovaná v ktorejkoľvek sekcii triedy, tj verejná alebo súkromná alebo chránená.

Nižšie sú uvedené niektoré ďalšie príklady funkcií priateľov v rôznych scenároch:

Funkcia priateľská k viacerým triedam

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ýkon
35 

Funkcia priateľov nám poskytuje spôsob prístupu k súkromným údajom, ale má aj svoje nevýhody. Nasleduje zoznam výhod a nevýhod funkcií priateľov v C++:

Výhody funkcií priateľov

  • Funkcia priateľa je schopná pristupovať k členom bez potreby dedenia triedy.
  • Funkcia priateľ funguje ako most medzi dvoma triedami prístupom k ich súkromným údajom.
  • Môže sa použiť na zvýšenie všestrannosti preťažených operátorov.
  • Môže byť deklarovaný buď vo verejnej alebo súkromnej alebo chránenej časti triedy.

Nevýhody funkcií priateľov

  • Funkcie priateľov majú prístup k súkromným členom triedy mimo triedy, čo porušuje zákon o ukrývaní údajov.
  • Funkcie priateľov nemôžu vo svojich členoch vykonávať žiadny polymorfizmus za behu.

Dôležité body o funkciách a triedach priateľov

  1. Priatelia by sa mali používať iba na obmedzené účely. Príliš veľa funkcií alebo externých tried je deklarovaných ako priateľov triedy s chráneným alebo súkromným prístupom k údajom, čo znižuje hodnotu zapuzdrenia samostatných tried v objektovo orientovanom programovaní.
  2. Priateľstvo je nie vzájomné . Ak je trieda A priateľom B, potom B sa automaticky nestáva priateľom A.
  3. Priateľstvo sa nededí. (Pozri toto pre viac detailov)
  4. Koncept priateľov nie je v Jave.