logo

Draugo klasė ir funkcija C++

A draugo klasė gali pasiekti privačius ir apsaugotus kitų klasių narius, kuriuose jis paskelbtas kaip draugas. Kartais naudinga leisti tam tikrai klasei pasiekti privačius ir apsaugotus kitų klasių narius. Pavyzdžiui, LinkedList klasei gali būti leista pasiekti privačius Node narius.

Naudodami C++ galime paskelbti draugo klasę draugas raktažodį.



Sintaksė:

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

Draugo klasė


Pavyzdys:



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

Išvestis
The value of Private Variable = 10 The value of Protected Variable = 99>

Pastaba: Mes galime deklaruoti draugo klasę arba funkciją bet kurioje pagrindinės klasės dalyje, nesvarbu, ar jos blokas yra privatus, apsaugotas ar viešas. Viskas veikia vienodai.

Draugo funkcija

Kaip ir draugo klasei, draugo funkcijai gali būti suteikta speciali prieiga privatiems ir apsaugotiems C++ klasės nariams. Jie nėra klasės narių funkcijos, bet gali pasiekti ir manipuliuoti privačiais ir saugomais tos klasės nariais, nes yra paskelbti draugais.

Draugo funkcija gali būti:



  1. Pasaulinė funkcija
  2. Kitos klasės nario funkcija
Draugo funkcija C++ su pavyzdžiu

Draugo funkcija C++

Sintaksė:

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>
draugo funkcijos sintaksė

Draugo funkcijos sintaksė

1. Visuotinė funkcija kaip draugo funkcija

Bet kurią globalią funkciją galime paskelbti draugo funkcija. Šiame pavyzdyje parodyta, kaip paskelbti visuotinę funkciją kaip draugo funkciją C++:

metodo nepaisymas java

Pavyzdys:

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

Išvestis
Private Variable: 10 Protected Variable: 99>

Pirmiau pateiktame pavyzdyje mes naudojome visuotinę funkciją kaip draugo funkciją. Kitame pavyzdyje kaip draugo funkciją naudosime kitos klasės nario funkciją.

2. Kitos klasės nario funkcija kaip draugo funkcija

Taip pat galime paskelbti kitos klasės nario funkciją kaip draugo funkciją C++ kalboje. Šis pavyzdys parodo, kaip naudoti kitos klasės nario funkciją kaip draugo funkciją C++:

Pavyzdys:

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

Išvestis
Private Variable: 10 Protected Variable: 99>

Pastaba : tvarka, kuria apibrėžiame kitos klasės draugo funkciją, yra svarbi ir ja reikia pasirūpinti. Mes visada turime apibrėžti abi klases prieš funkcijos apibrėžimą. Štai kodėl mes naudojome ne klasės nario funkcijos apibrėžimą.

Draugo funkcijų ypatybės

  • Draugo funkcija yra speciali C++ funkcija, kuri, nepaisant to, kad ji nėra klasės narys, turi privilegiją prieiga į privatūs ir apsaugoti duomenys klasės.
  • Draugo funkcija yra nenario funkcija arba įprasta klasės funkcija, kuri deklaruojama kaip draugas naudojant raktinį žodį draugas klasės viduje. Paskelbus funkciją kaip draugu, funkcijai suteikiamos visos prieigos teisės.
  • Raktinis žodis draugas dedamas tik draugo funkcijos ir funkcijos deklaracijoje ne viduje funkcijos apibrėžimas arba skambutis.
  • Draugo funkcija vadinama kaip įprasta funkcija. Jo negalima iškviesti naudojant objekto pavadinimą ir taško operatorių. Tačiau jis gali priimti objektą kaip argumentą, kurio vertę nori pasiekti.
  • Draugo funkcija gali būti deklaruojama bet kurioje klasės dalyje, ty viešoje, privačioje arba apsaugotoje.

Toliau pateikiami dar keli draugo funkcijų pavyzdžiai įvairiuose scenarijuose:

Funkcija, tinkanti kelioms klasėms

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

Išvestis
35>

Draugo funkcija suteikia mums galimybę pasiekti privačius duomenis, tačiau ji taip pat turi trūkumų. Toliau pateikiamas C++ draugo funkcijų pranašumų ir trūkumų sąrašas:

Draugo funkcijų pranašumai

  • Draugo funkcija gali pasiekti narius nepaveldėjus klasės.
  • Draugo funkcija veikia kaip tiltas tarp dviejų klasių, pasiekiant jų privačius duomenis.
  • Jis gali būti naudojamas siekiant padidinti perkrautų operatorių universalumą.
  • Jis gali būti deklaruojamas tiek viešoje, tiek privačioje arba saugomoje klasės dalyje.

Draugo funkcijų trūkumai

  • Draugo funkcijos turi prieigą prie privačių klasės narių iš ne klasės, o tai pažeidžia duomenų slėpimo įstatymą.
  • Draugo funkcijos negali atlikti jokio vykdymo laiko polimorfizmo savo nariuose.

Svarbūs dalykai apie draugo funkcijas ir klases

  1. Draugai turėtų būti naudojami tik ribotiems tikslams. Per daug funkcijų arba išorinių klasių yra deklaruojamos kaip klasės draugai su apsaugota arba privačia prieiga prie duomenų, sumažina atskirų klasių inkapsuliavimo objektinio programavimo vertę.
  2. Draugystė yra ne abipusis . Jei A klasė yra B draugas, tai B automatiškai netampa A draugu.
  3. Draugystė nėra paveldima. (Matyti tai daugiau detalių)
  4. „Java“ nėra draugų sąvokos.