In deze tutorial leren we met behulp van voorbeelden vriendfuncties en vriendklassen in C ++ te maken.
Gegevens verbergen is een fundamenteel concept van objectgeoriënteerd programmeren. Het beperkt de toegang van privéleden van buiten de klas.
Evenzo zijn beschermde leden alleen toegankelijk voor afgeleide klassen en niet van buitenaf. Bijvoorbeeld,
class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )
Er is echter een functie in C ++ genaamd vriendfuncties die deze regel overtreden en ons toegang geven tot ledenfuncties van buiten de klas.
Evenzo is er ook een vriendenklas , die we later in deze tutorial zullen leren.
friend Functie in C ++
Een vriendenfunctie heeft toegang tot de persoonlijke en beschermde gegevens van een klas. We declareren een vriendfunctie met behulp van het friend
trefwoord in de hoofdtekst van de klas.
class className (… friend returnType functionName(arguments);… )
Voorbeeld 1: werking van vriendfunctie
// C++ program to demonstrate the working of friend function #include using namespace std; class Distance ( private: int meter; // friend function friend int addFive(Distance); public: Distance() : meter(0) () ); // friend function definition int addFive(Distance d) ( //accessing private members from the friend function d.meter += 5; return d.meter; ) int main() ( Distance D; cout << "Distance: " << addFive(D); return 0; )
Uitvoer
Afstand: 5
Hier addFive()
is een vriendenfunctie die toegang heeft tot zowel privé- als openbare gegevensleden.
Hoewel dit voorbeeld ons een idee geeft van het concept van een vriendfunctie, toont het geen zinvol gebruik.
Een zinvoller gebruik zou zijn om te werken met objecten van twee verschillende klassen. Dat is wanneer de vriendenfunctie erg nuttig kan zijn.
Voorbeeld 2: leden van twee verschillende klassen toevoegen
// Add members of two different classes using friend functions #include using namespace std; // forward declaration class ClassB; class ClassA ( public: // constructor to initialize numA to 12 ClassA() : numA(12) () private: int numA; // friend function declaration friend int add(ClassA, ClassB); ); class ClassB ( public: // constructor to initialize numB to 1 ClassB() : numB(1) () private: int numB; // friend function declaration friend int add(ClassA, ClassB); ); // access members of both classes int add(ClassA objectA, ClassB objectB) ( return (objectA.numA + objectB.numB); ) int main() ( ClassA objectA; ClassB objectB; cout << "Sum: " << add(objectA, objectB); return 0; )
Uitvoer
Som: 13
In dit programma, ClassA
en ClassB
heb verklaard add()
als een vriend functie. Deze functie heeft dus toegang tot privégegevens van beide klassen.
Een ding dat hier opvalt, is dat de vriendfunctie binnenin ClassA
de ClassB
. We hebben ClassB
op dit moment echter nog geen definitie gegeven.
// inside classA friend int add(ClassA, ClassB);
Om dit te laten werken, hebben we een voorwaartse verklaring van ClassB
in ons programma nodig.
// forward declaration class ClassB;
vriend Klasse in C ++
We kunnen ook een klasse van een vriend in C ++ gebruiken met behulp van het friend
trefwoord. Bijvoorbeeld,
class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )
Wanneer een klas tot vriendenklasse wordt verklaard, worden alle lidfuncties van de vriendenklasse vriendfuncties.
Omdat het classB
een vriendenklasse is, hebben we toegang tot alle leden van classA
binnenuit classB
.
We hebben echter geen toegang tot leden van ClassB
van binnenuit classA
. Het is omdat vriendrelatie in C ++ alleen wordt verleend, niet wordt ingenomen.
Voorbeeld 3: C ++ Friend Class
// C++ program to demonstrate the working of friend class #include using namespace std; // forward declaration class ClassB; class ClassA ( private: int numA; // friend class declaration friend class ClassB; public: // constructor to initialize numA to 12 ClassA() : numA(12) () ); class ClassB ( private: int numB; public: // constructor to initialize numB to 1 ClassB() : numB(1) () // member function to add numA // from ClassA and numB from ClassB int add() ( ClassA objectA; return objectA.numA + numB; ) ); int main() ( ClassB objectB; cout << "Sum: " << objectB.add(); return 0; )
Uitvoer
Som: 13
Hier ClassB
is een vriendenklasse van ClassA
. Dus, ClassB
heeft toegang tot de leden van classA
.
In ClassB
hebben we een functie gemaakt add()
die de som van numA en numB retourneert.
Omdat het ClassB
een vriendenklasse is, kunnen we objecten van ClassA
binnenuit maken ClassB
.