logo

Ystäväluokka ja funktio C++:ssa

A ystäväluokka voi käyttää yksityisiä ja suojattuja jäseniä muista luokista, joissa se on ilmoitettu ystäväksi. Joskus on hyödyllistä antaa tietylle luokalle pääsy muiden luokkien yksityisiin ja suojattuihin jäseniin. Esimerkiksi LinkedList-luokalla voidaan sallia pääsy Noden yksityisille jäsenille.

Voimme ilmoittaa ystäväluokan C++:ssa käyttämällä ystävä avainsana.



tiedostojärjestelmä linuxissa

Syntaksi:

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

Ystäväluokka


Esimerkki:



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

Lähtö
The value of Private Variable = 10 The value of Protected Variable = 99>

Huomautus: Voimme ilmoittaa ystäväluokan tai toiminnon missä tahansa perusluokan rungossa, olipa se yksityinen, suojattu tai julkinen lohko. Se toimii kaikki samalla tavalla.

Ystävätoiminto

Ystäväluokan tapaan ystävätoiminnolle voidaan myöntää erityinen käyttöoikeus luokan yksityisille ja suojatuille jäsenille C++:ssa. He eivät ole luokan jäsentoimintoja, mutta voivat käyttää ja manipuloida kyseisen luokan yksityisiä ja suojattuja jäseniä, koska heidät on julistettu ystäviksi.

Ystävätoiminto voi olla:



  1. Globaali toiminto
  2. Toisen luokan jäsenfunktio
Ystävätoiminto C++:ssa esimerkin kanssa

Ystävätoiminto C++:ssa

Syntaksi:

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>
ystäväfunktion syntaksi

Ystäväfunktion syntaksi

1. Globaali toiminto ystäväfunktiona

Voimme julistaa minkä tahansa globaalin funktion ystäväfunktioksi. Seuraava esimerkki osoittaa, kuinka globaali funktio määritellään ystäväfunktioksi C++:ssa:

Esimerkki:

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

Lähtö
Private Variable: 10 Protected Variable: 99>

Yllä olevassa esimerkissä olemme käyttäneet globaalia funktiota ystäväfunktiona. Seuraavassa esimerkissä käytämme ystäväfunktiona toisen luokan jäsenfunktiota.

2. Toisen luokan jäsenfunktio ystäväfunktiona

Voimme myös ilmoittaa toisen luokan jäsenfunktion ystäväfunktioksi C++:ssa. Seuraava esimerkki osoittaa, kuinka toisen luokan jäsenfunktiota käytetään ystäväfunktiona C++:ssa:

mylivecricket.in

Esimerkki:

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

Lähtö
Private Variable: 10 Protected Variable: 99>

Huomautus : Järjestys, jossa määritämme toisen luokan ystäväfunktion, on tärkeä ja siitä tulee huolehtia. Meidän on aina määriteltävä molemmat luokat ennen funktion määritelmää. Siksi olemme käyttäneet luokan ulkopuolista jäsenfunktion määritelmää.

Ystävätoimintojen ominaisuudet

  • Ystäväfunktio on C++:n erityinen funktio, jolla on etuoikeus siitä huolimatta, että se ei ole luokan jäsenfunktio. pääsy the yksityisiä ja suojattuja tietoja luokasta.
  • Ystäväfunktio on luokan ei-jäsenfunktio tai tavallinen funktio, joka ilmoitetaan ystäväksi avainsanalla ystävä luokan sisällä. Ilmoittamalla toiminnon ystäväksi, funktiolle annetaan kaikki käyttöoikeudet.
  • Avainsana ystävä sijoitetaan vain ystäväfunktion ja funktion määrittelyyn ei in funktion määrittely tai kutsu.
  • Ystäväfunktiota kutsutaan tavalliseksi funktioksi. Sitä ei voi kutsua käyttämällä objektin nimeä ja pisteoperaattoria. Se voi kuitenkin hyväksyä objektin argumenttina, jonka arvoa se haluaa käyttää.
  • Ystäväfunktio voidaan ilmoittaa missä tahansa luokan osassa, eli julkinen tai yksityinen tai suojattu.

Alla on muutamia esimerkkejä ystävätoiminnoista eri tilanteissa:

Toimintoystävällinen useille luokille

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

Lähtö
35>

Ystävätoiminto tarjoaa meille tavan päästä käsiksi yksityisiin tietoihin, mutta sillä on myös haittapuolensa. Seuraavassa on luettelo ystävätoimintojen eduista ja haitoista C++:ssa:

Ystävätoimintojen edut

  • Ystävätoiminto voi käyttää jäseniä ilman luokan perimistä.
  • Ystävätoiminto toimii siltana kahden luokan välillä käyttämällä heidän yksityisiä tietojaan.
  • Sen avulla voidaan lisätä ylikuormitettujen käyttäjien monipuolisuutta.
  • Se voidaan ilmoittaa joko julkisessa tai yksityisessä tai suojatussa osassa.

Ystävätoimintojen haitat

  • Ystävätoiminnoilla on pääsy luokan yksityisiin jäseniin luokan ulkopuolelta, mikä rikkoo tietojen piilottamisen lakia.
  • Ystäväfunktiot eivät voi tehdä jäsenissään ajonaikaista polymorfiaa.

Tärkeitä seikkoja ystävätoiminnoista ja luokista

  1. Ystäviä tulee käyttää vain rajoitettuihin tarkoituksiin. Liian monet funktiot tai ulkoiset luokat on ilmoitettu luokan ystäviksi, joilla on suojattu tai yksityinen pääsy tietoihin, mikä vähentää erillisten luokkien kapseloinnin arvoa olio-ohjelmoinnissa.
  2. Ystävyys on ei molemminpuolista . Jos luokka A on B:n ystävä, B:stä ei tule automaattisesti A:n ystävää.
  3. Ystävyys ei ole peritty. (Katso Tämä Lisätietoja)
  4. Ystävien käsite ei ole Javassa.