logo

Clasa de prieteni și funcție în C++

A clasa de prieteni poate accesa membrii privați și protejați ai altor clase în care este declarat prieten. Uneori este util să permiteți unei anumite clase să acceseze membrii privați și protejați ai altor clase. De exemplu, unei clase LinkedList i se poate permite să acceseze membrii privați ai Node.

deschide meniul de setări

Putem declara o clasă prietenă în C++ utilizând prieten cuvânt cheie.



Sintaxă:

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

Clasa de prieteni


Exemplu:



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

Ieșire
The value of Private Variable = 10 The value of Protected Variable = 99>

Notă: Putem declara clasa prietenă sau funcție oriunde în corpul clasei de bază, indiferent dacă este blocul privat, protejat sau public. Funcționează la fel.

Funcția de prieten

La fel ca o clasă prietenă, unei funcții prieten i se poate acorda acces special membrilor privați și protejați ai unei clase în C++. Ele nu sunt funcțiile membre ale clasei, dar pot accesa și manipula membrii privați și protejați ai acelei clase, deoarece sunt declarați prieteni.

O funcție prieten poate fi:



dezavantajele serviciilor bancare online
  1. O funcție globală
  2. O funcție membră a unei alte clase
Funcția Friend în C++ cu Exemplu

Funcția prieten în C++

Sintaxă:

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>
sintaxa funcției prieten

Sintaxa funcției prieten

1. Funcție globală ca funcție prieten

Putem declara orice funcție globală ca funcție prieten. Următorul exemplu demonstrează cum să declarați o funcție globală ca funcție prietenă în C++:

Exemplu:

alfabet în numere
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; }>

Ieșire
Private Variable: 10 Protected Variable: 99>

În exemplul de mai sus, am folosit o funcție globală ca funcție prieten. În exemplul următor, vom folosi o funcție membru a unei alte clase ca funcție prieten.

2. Funcția de membru al unei alte clase ca funcție prieten

De asemenea, putem declara o funcție membru a unei alte clase ca funcție prieten în C++. Următorul exemplu demonstrează cum să utilizați o funcție membru a unei alte clase ca funcție prieten în C++:

Exemplu:

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

Ieșire
Private Variable: 10 Protected Variable: 99>

Notă : Ordinea în care definim funcția de prieten a unei alte clase este importantă și trebuie avută în vedere. Trebuie să definim întotdeauna ambele clase înainte de definirea funcției. De aceea am folosit definiția funcției de membru în afara clasei.

Caracteristici ale funcțiilor prieten

  • O funcție prieten este o funcție specială în C++ care, în ciuda faptului că nu este o funcție membră a unei clase, are privilegiul de a acces cel date private și protejate a unei clase.
  • O funcție prieten este o funcție non-membră sau o funcție obișnuită a unei clase, care este declarată ca prieten folosind cuvântul cheie prieten în interiorul clasei. Prin declararea unei funcții ca prieten, toate permisiunile de acces sunt acordate funcției.
  • Cuvântul cheie prieten este plasat numai în declarația funcției a funcției prieten și nu în definirea funcției sau apel.
  • O funcție prieten este numită ca o funcție obișnuită. Nu poate fi apelat folosind numele obiectului și operatorul punct. Cu toate acestea, poate accepta obiectul ca argument a cărui valoare dorește să o acceseze.
  • O funcție prieten poate fi declarată în orice secțiune a clasei, adică publică sau privată sau protejată.

Mai jos sunt câteva exemple de funcții prieten în diferite scenarii:

O funcție prietenoasă cu mai multe clase

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

Ieșire
35>

Funcția friend ne oferă o modalitate de a accesa datele private, dar are și dezavantajele ei. Mai jos este lista de avantaje și dezavantaje ale funcțiilor prieten în C++:

Avantajele funcțiilor prieten

  • O funcție prieten este capabilă să acceseze membrii fără a fi nevoie să moștenească clasa.
  • Funcția prieten acționează ca o punte între două clase prin accesarea datelor lor private.
  • Poate fi folosit pentru a crește versatilitatea operatorilor supraîncărcați.
  • Poate fi declarat fie în partea publică, fie privată sau protejată a clasei.

Dezavantajele funcțiilor prietenului

  • Funcțiile prieten au acces la membrii privați ai unei clase din afara clasei, ceea ce încalcă legea ascunderii datelor.
  • Funcțiile prieten nu pot face niciun polimorfism în timpul rulării în membrii lor.

Puncte importante despre funcțiile și cursurile prietenilor

  1. Prietenii ar trebui folosiți numai în scopuri limitate. Prea multe funcții sau clase externe sunt declarate ca prieteni ai unei clase cu acces la date protejate sau private diminuează valoarea încapsulării unor clase separate în programarea orientată pe obiecte.
  2. Prietenia este nu reciprocă . Dacă clasa A este prietenă cu B, atunci B nu devine automat prieten cu A.
  3. Prietenia nu se moștenește. (Vedea acest pentru mai multe detalii)
  4. Conceptul de prieteni nu este în Java.