C ++ vänfunktioner och klasser (med exempel)

Innehållsförteckning

I den här handledningen lär vi oss att skapa vänfunktioner och vänklasser i C ++ med hjälp av exempel.

Datadöljande är ett grundläggande begrepp för objektorienterad programmering. Det begränsar tillgången till privata medlemmar utanför klassen.

På samma sätt kan skyddade medlemmar endast nås av härledda klasser och är oåtkomliga utifrån. Till exempel,

 class MyClass ( private: int member1; ) int main() ( MyClass obj; // Error! Cannot access private members from here. obj.member1 = 5; )

Det finns dock en funktion i C ++ som kallas vänfunktioner som bryter mot denna regel och tillåter oss att komma åt medlemsfunktioner utanför klassen.

På samma sätt finns det också en vänklass , som vi lär oss senare i denna handledning.

vänfunktion i C ++

En vänfunktion kan komma åt privata och skyddade data för en klass. Vi förklarar en vänfunktion med hjälp av friendnyckelordet i klassens kropp.

 class className (… friend returnType functionName(arguments);… )

Exempel 1: Arbeta med vän Funktion

 // 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; )

Produktion

 Avstånd: 5

Här addFive()är en vänfunktion som kan komma åt både privata och offentliga datamedlemmar.

Även om detta exempel ger oss en uppfattning om konceptet med en vänfunktion, visar det ingen meningsfull användning.

En mer meningsfull användning skulle fungera på objekt av två olika klasser. Det är då vänfunktionen kan vara till stor hjälp.

Exempel 2: Lägg till medlemmar i två olika klasser

 // 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; )

Produktion

 Summa: 13

I detta program, ClassAoch ClassBhar deklarerat add()som en vänfunktion. Således kan denna funktion få åtkomst till privata data för båda klasserna.

En sak att lägga märke till här är att vänfunktionen inuti ClassAär att använda ClassB. Vi har dock inte definierat ClassBvid denna tidpunkt.

 // inside classA friend int add(ClassA, ClassB);

För att detta ska fungera behöver vi en framåtriktad deklaration av ClassBi vårt program.

 // forward declaration class ClassB;

vänklass i C ++

Vi kan också använda en vänklass i C ++ med hjälp av friendnyckelordet. Till exempel,

 class ClassB; class ClassA ( // ClassB is a friend class of ClassA friend class ClassB;… ) class ClassB (… )

När en klass förklaras som en vänklass blir alla medlemsfunktioner i vänklassen vänfunktioner.

Eftersom det classBär en vänklass kan vi komma åt alla medlemmar classAfrån insidan classB.

Vi kan dock inte komma åt medlemmar ClassBfrån inifrån classA. Det beror på att vänförhållandet i C ++ bara beviljas, inte tas.

Exempel 3: C ++ vänklass

 // 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; )

Produktion

 Summa: 13

Här ClassBär en vänklass av ClassA. Så ClassBhar tillgång till medlemmarna i classA.

I ClassBhar vi skapat en funktion add()som returnerar summan av numA och numB.

Eftersom det ClassBär en vänklass kan vi skapa objekt av ClassAinsidan av ClassB.

Intressanta artiklar...