logo

Prijateljski razred in funkcija v C++

A prijateljski razred lahko dostopa do zasebnih in zaščitenih članov drugih razredov, v katerih je deklariran kot prijatelj. Včasih je koristno dovoliti določenemu razredu dostop do zasebnih in zaščitenih članov drugih razredov. Na primer, razredu LinkedList je lahko dovoljen dostop do zasebnih članov vozlišča.

Prijateljski razred lahko deklariramo v C++ z uporabo prijatelj ključna beseda.



Sintaksa:

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

Prijateljski razred


primer:



matrike v programiranju c
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; }>

Izhod
The value of Private Variable = 10 The value of Protected Variable = 99>

Opomba: Prijateljski razred ali funkcijo lahko deklariramo kjer koli v telesu osnovnega razreda, ne glede na to, ali gre za zasebni, zaščiteni ali javni blok. Vse deluje enako.

Funkcija prijatelja

Tako kot prijateljskemu razredu se lahko prijateljski funkciji dodeli poseben dostop do zasebnih in zaščitenih članov razreda v C++. Niso članske funkcije razreda, lahko pa dostopajo do zasebnih in zaščitenih članov tega razreda in jih manipulirajo, ker so deklarirani kot prijatelji.

Prijateljska funkcija je lahko:



  1. Globalna funkcija
  2. Članska funkcija drugega razreda
Funkcija prijatelja v C++ s primerom

Funkcija prijatelja v C++

Sintaksa:

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>
sintaksa funkcije prijatelja

Sintaksa funkcije Friend

1. Globalna funkcija kot prijateljska funkcija

Vsako globalno funkcijo lahko razglasimo za prijateljsko funkcijo. Naslednji primer prikazuje, kako deklarirati globalno funkcijo kot prijateljsko funkcijo v C++:

primer:

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

Izhod
Private Variable: 10 Protected Variable: 99>

V zgornjem primeru smo uporabili globalno funkcijo kot funkcijo prijatelja. V naslednjem primeru bomo uporabili funkcijo člana drugega razreda kot funkcijo prijatelja.

2. Funkcija člana drugega razreda kot funkcija prijatelja

Prav tako lahko deklariramo funkcijo člana drugega razreda kot funkcijo prijatelja v C++. Naslednji primer prikazuje, kako uporabiti funkcijo člana drugega razreda kot funkcijo prijatelja v C++:

primer:

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

Izhod
Private Variable: 10 Protected Variable: 99>

Opomba : Vrstni red, v katerem definiramo funkcijo prijatelja drugega razreda, je pomemben in nanj je treba paziti. Pred definicijo funkcije moramo vedno definirati oba razreda. Zato smo uporabili definicijo funkcije člana zunaj razreda.

Značilnosti funkcij Friend

  • Prijateljska funkcija je posebna funkcija v C++, ki ima kljub temu, da ni članska funkcija razreda, privilegij dostop the zasebnih in zaščitenih podatkov razreda.
  • Prijateljska funkcija je nečlanska funkcija ali običajna funkcija razreda, ki je deklarirana kot prijatelj s ključno besedo prijatelj znotraj razreda. Če funkcijo razglasite za prijatelja, se tej funkciji dodelijo vsa dovoljenja za dostop.
  • Ključna beseda prijatelj je postavljena samo v deklaracijo funkcije funkcije prijatelja in ne v definicija ali klic funkcije.
  • Prijateljska funkcija se imenuje kot običajna funkcija. Ni ga mogoče poklicati z uporabo imena predmeta in operatorja pike. Lahko pa sprejme objekt kot argument, do katerega vrednosti želi dostopati.
  • Funkcijo prijatelja je mogoče deklarirati v katerem koli razdelku razreda, tj. javnem, zasebnem ali zaščitenem.

Spodaj je še nekaj primerov funkcij prijateljev v različnih scenarijih:

razvrščanje tulp python

Funkcija, prijazna do več razredov

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

Izhod
35>

Funkcija prijatelja nam omogoča dostop do zasebnih podatkov, vendar ima tudi svoje pomanjkljivosti. Sledi seznam prednosti in slabosti prijateljskih funkcij v C++:

Prednosti funkcij Friend

  • Prijateljska funkcija lahko dostopa do članov brez potrebe po dedovanju razreda.
  • Funkcija prijatelja deluje kot most med dvema razredoma z dostopom do njunih zasebnih podatkov.
  • Uporablja se lahko za povečanje vsestranskosti preobremenjenih operaterjev.
  • Lahko se prijavi v javnem ali zasebnem ali zaščitenem delu razreda.

Slabosti funkcij Friend

  • Prijateljske funkcije imajo dostop do zasebnih članov razreda zunaj razreda, kar krši zakon o skrivanju podatkov.
  • Prijateljske funkcije ne morejo izvajati polimorfizma v času izvajanja v svojih članih.

Pomembne točke o funkcijah in razredih prijateljev

  1. Prijatelje je treba uporabljati samo za omejene namene. Preveč funkcij ali zunanjih razredov je deklariranih kot prijateljev razreda z zaščitenim ali zasebnim dostopom do podatkov, kar zmanjšuje vrednost enkapsulacije ločenih razredov v objektno usmerjenem programiranju.
  2. Prijateljstvo je ne obojestransko . Če je razred A prijatelj B-ja, potem B ne postane samodejno prijatelj A-ja.
  3. Prijateljstvo se ne deduje. (Glej to za več podrobnosti)
  4. Koncepta prijateljev ni v Javi.