C ++ Friend-functies en -klassen (met voorbeelden)

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 friendtrefwoord 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, ClassAen ClassBheb 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 ClassAde ClassB. We hebben ClassBop 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 ClassBin 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 friendtrefwoord. 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 classBeen vriendenklasse is, hebben we toegang tot alle leden van classAbinnenuit classB.

We hebben echter geen toegang tot leden van ClassBvan 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 ClassBis een vriendenklasse van ClassA. Dus, ClassBheeft toegang tot de leden van classA.

In ClassBhebben we een functie gemaakt add()die de som van numA en numB retourneert.

Omdat het ClassBeen vriendenklasse is, kunnen we objecten van ClassAbinnenuit maken ClassB.

Interessante artikelen...