A kompisklass kan komma åt privata och skyddade medlemmar i andra klasser där den har förklarats som en vän. Det är ibland användbart att tillåta en viss klass att komma åt privata och skyddade medlemmar i andra klasser. Till exempel kan en LinkedList-klass tillåtas komma åt privata medlemmar av Node.
Vi kan deklarera en vänklass i C++ genom att använda vän nyckelord.
Syntax:
friend class class_name; // declared in the base class>

Kompisklass
Exempel:
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; }> Produktion
The value of Private Variable = 10 The value of Protected Variable = 99>
Notera: Vi kan deklarera vänklass eller fungera var som helst i basklasskroppen oavsett om det är privat, skyddat eller offentligt block. Det fungerar likadant.
Vänfunktion
Liksom en vänklass kan en vänfunktion ges särskild åtkomst till privata och skyddade medlemmar i en klass i C++. De är inte klassens medlemsfunktioner men kan komma åt och manipulera de privata och skyddade medlemmarna i den klassen eftersom de förklaras som vänner.
En vänfunktion kan vara:
- En global funktion
- En medlemsfunktion av en annan klass

Vänfunktion i C++
Syntax:
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>

Syntax för vänfunktion
1. Global funktion som vän-funktion
Vi kan deklarera vilken global funktion som helst som en vänfunktion. Följande exempel visar hur man deklarerar en global funktion som en vänfunktion i C++:
Exempel:
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; }> Produktion
Private Variable: 10 Protected Variable: 99>
I exemplet ovan har vi använt en global funktion som en vänfunktion. I nästa exempel kommer vi att använda en medlemsfunktion i en annan klass som en vänfunktion.
2. Medlemsfunktion i en annan klass som vänfunktion
Vi kan också deklarera en medlemsfunktion i en annan klass som en vänfunktion i C++. Följande exempel visar hur man använder en medlemsfunktion i en annan klass som en vänfunktion i C++:
Exempel:
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; }> Produktion
Private Variable: 10 Protected Variable: 99>
Notera : Ordningen i vilken vi definierar vänfunktionen för en annan klass är viktig och bör tas om hand. Vi måste alltid definiera båda klasserna före funktionsdefinitionen. Det är därför vi har använt funktionsdefinitionen utanför klassen.
cobol programmering
Funktioner i vänfunktioner
- En vänfunktion är en speciell funktion i C++ som trots att den inte är medlem i en klass har privilegiet att tillgång de privat och skyddad data av en klass.
- En vänfunktion är en icke-medlemsfunktion eller vanlig funktion i en klass, som deklareras som en vän med nyckelordet vän inne i klassen. Genom att deklarera en funktion som en vän ges alla åtkomstbehörigheter till funktionen.
- Nyckelordet vän placeras endast i funktionsdeklarationen för vänfunktionen och inte i funktionsdefinition eller anrop.
- En vänfunktion kallas som en vanlig funktion. Det kan inte anropas med objektnamnet och punktoperatorn. Det kan dock acceptera objektet som ett argument vars värde den vill komma åt.
- En vänfunktion kan deklareras i vilken del av klassen som helst, dvs offentlig eller privat eller skyddad.
Nedan finns några fler exempel på vänfunktioner i olika scenarier:
En funktionsvänlig för flera 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; }> Produktion
35>
Vänfunktionen ger oss ett sätt att komma åt privata data men det har också sina nackdelar. Följande är listan över fördelar och nackdelar med vänfunktioner i C++:
Fördelar med vänfunktioner
- En vänfunktion kan komma åt medlemmar utan att behöva ärva klassen.
- Vänfunktionen fungerar som en brygga mellan två klasser genom att komma åt deras privata data.
- Den kan användas för att öka mångsidigheten hos överbelastade förare.
- Det kan deklareras antingen i den offentliga eller privata eller skyddade delen av klassen.
Nackdelar med vänfunktioner
- Vänfunktioner har tillgång till privata medlemmar i en klass utanför klassen, vilket bryter mot lagen om att dölja data.
- Vänfunktioner kan inte göra någon körtidspolymorfism i sina medlemmar.
Viktiga punkter om kompisfunktioner och klasser
- Vänner bör endast användas för begränsade ändamål. För många funktioner eller externa klasser deklareras som vänner till en klass med skyddad eller privat dataåtkomst minskar värdet av inkapsling av separata klasser i objektorienterad programmering.
- Vänskap är inte ömsesidigt . Om klass A är en vän till B, blir B inte en vän till A automatiskt.
- Vänskap går inte i arv. (Ser detta för mer detaljer)
- Begreppet vänner finns inte i Java.