logo

Venneklasse og funksjon i C++

EN venneklasse kan få tilgang til private og beskyttede medlemmer av andre klasser der den er erklært som en venn. Noen ganger er det nyttig å la en bestemt klasse få tilgang til private og beskyttede medlemmer av andre klasser. For eksempel kan en LinkedList-klasse få tilgang til private medlemmer av Node.

Vi kan erklære en venneklasse i C++ ved å bruke venn nøkkelord.



java sammenligne strenger

Syntaks:

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

Venneklasse


Eksempel:



streng i char java
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; }>

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

Merk: Vi kan erklære venneklasse eller fungere hvor som helst i basisklassen, enten den er privat, beskyttet eller offentlig blokk. Det fungerer på samme måte.

vennefunksjon

Som en venneklasse kan en vennefunksjon gis spesiell tilgang til private og beskyttede medlemmer av en klasse i C++. De er ikke medlemsfunksjonene til klassen, men kan få tilgang til og manipulere de private og beskyttede medlemmene av den klassen for de er erklært som venner.

En vennefunksjon kan være:



  1. En global funksjon
  2. En medlemsfunksjon av en annen klasse
Vennefunksjon i C++ med eksempel

Vennefunksjon i C++

Syntaks:

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>
venn funksjon syntaks

Syntaks for vennefunksjon

1. Global funksjon som vennefunksjon

Vi kan erklære enhver global funksjon som en vennefunksjon. Følgende eksempel viser hvordan du erklærer en global funksjon som en vennefunksjon i C++:

substring_index i sql

Eksempel:

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

Produksjon
Private Variable: 10 Protected Variable: 99>

I eksemplet ovenfor har vi brukt en global funksjon som en vennefunksjon. I neste eksempel vil vi bruke en medlemsfunksjon av en annen klasse som en vennefunksjon.

2. Medlemsfunksjon i en annen klasse som vennefunksjon

Vi kan også erklære en medlemsfunksjon av en annen klasse som en vennefunksjon i C++. Følgende eksempel viser hvordan du bruker en medlemsfunksjon fra en annen klasse som en vennefunksjon i C++:

Eksempel:

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

Produksjon
Private Variable: 10 Protected Variable: 99>

Merk : Rekkefølgen vi definerer vennefunksjonen til en annen klasse i er viktig og bør tas vare på. Vi må alltid definere begge klassene før funksjonsdefinisjonen. Det er derfor vi har brukt funksjonsdefinisjon utenfor klassen.

Funksjoner av vennefunksjoner

  • En vennefunksjon er en spesiell funksjon i C++ som til tross for at den ikke er medlem av en klasse har privilegiet til å adgang de private og beskyttede data av en klasse.
  • En vennefunksjon er en ikke-medlemsfunksjon eller vanlig funksjon i en klasse, som er erklært som en venn ved å bruke nøkkelordet venn inne i klassen. Ved å erklære en funksjon som en venn, gis alle tilgangstillatelsene til funksjonen.
  • Nøkkelordet venn plasseres kun i funksjonserklæringen til vennfunksjonen og ikke i funksjonsdefinisjon eller kall.
  • En vennefunksjon kalles som en vanlig funksjon. Den kan ikke kalles ved å bruke objektnavnet og punktoperatoren. Imidlertid kan den godta objektet som et argument hvis verdi den ønsker tilgang til.
  • En vennefunksjon kan erklæres i hvilken som helst del av klassen, dvs. offentlig eller privat eller beskyttet.

Nedenfor er noen flere eksempler på vennefunksjoner i forskjellige scenarier:

En funksjonsvennlig for flere klasser

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

Produksjon
35>

Vennefunksjonen gir oss en måte å få tilgang til private data på, men den har også sine ulemper. Følgende er listen over fordeler og ulemper med vennefunksjoner i C++:

Fordeler med vennefunksjoner

  • En vennefunksjon kan få tilgang til medlemmer uten å måtte arve klassen.
  • Vennefunksjonen fungerer som en bro mellom to klasser ved å få tilgang til deres private data.
  • Den kan brukes til å øke allsidigheten til overbelastede operatører.
  • Det kan deklareres enten i den offentlige eller private eller beskyttede delen av klassen.

Ulemper med vennefunksjoner

  • Vennefunksjoner har tilgang til private medlemmer av en klasse fra utenfor klassen som bryter loven om dataskjuling.
  • Vennefunksjoner kan ikke gjøre noen løpetidspolymorfisme i medlemmene.

Viktige punkter om vennefunksjoner og klasser

  1. Venner bør kun brukes til begrensede formål. For mange funksjoner eller eksterne klasser er erklært som venner av en klasse med beskyttet eller privat datatilgang, reduserer verdien av innkapsling av separate klasser i objektorientert programmering.
  2. Vennskap er ikke gjensidig . Hvis klasse A er en venn av B, blir ikke B en venn av A automatisk.
  3. Vennskap går ikke i arv. (Se dette for flere detaljer)
  4. Konseptet med venner er ikke i Java.