C ++ venfunktioner og klasser (med eksempler)

I denne vejledning lærer vi at oprette venfunktioner og venneklasser i C ++ ved hjælp af eksempler.

Data skjul er et grundlæggende koncept for objektorienteret programmering. Det begrænser adgangen til private medlemmer uden for klassen.

På samme måde kan beskyttede medlemmer kun få adgang til afledte klasser og er utilgængelige udefra. For eksempel,

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

Der er dog en funktion i C ++, der kaldes venfunktioner, der bryder denne regel og giver os adgang til medlemsfunktioner uden for klassen.

Tilsvarende er der også en venklasse , som vi vil lære senere i denne vejledning.

ven Funktion i C ++

En venfunktion kan få adgang til de private og beskyttede data i en klasse. Vi erklærer en venfunktion ved hjælp af friendnøgleordet inde i klassen.

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

Eksempel 1: Arbejde med ven 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

 Afstand: 5

Her addFive()er en venfunktion, der kan få adgang til både private og offentlige datamedlemmer.

Selvom dette eksempel giver os en idé om begrebet en venfunktion, viser det ingen meningsfuld anvendelse.

En mere meningsfuld anvendelse ville være at operere på objekter i to forskellige klasser. Det er da venfunktionen kan være meget nyttigt.

Eksempel 2: Tilføj medlemmer af to forskellige 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

 Summen: 13

I dette program, ClassAog ClassBhar erklæret add()som en ven funktion. Således kan denne funktion få adgang til private data fra begge klasser.

En ting at bemærke her er, at venfunktionen indeni ClassAbruger ClassB. Vi har dog ikke defineret ClassBpå dette tidspunkt.

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

For at dette skal fungere, har vi brug for en fremsendende erklæring om ClassBi vores program.

 // forward declaration class ClassB;

ven klasse i C ++

Vi kan også bruge en vensklasse i C ++ ved hjælp af friendnøgleordet. For eksempel,

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

Når en klasse erklæres som en vensklasse, bliver alle medlemsfunktionerne i venneklassen venfunktioner.

Da det classBer en vensklasse, kan vi få adgang til alle medlemmer af classAindefra classB.

Vi kan dog ikke få adgang til medlemmer af ClassBindefra classA. Det er fordi venneforholdet i C ++ kun tildeles, ikke tages.

Eksempel 3: C ++ ven klasse

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

 Summen: 13

Her ClassBer en ven klasse af ClassA. Så ClassBhar adgang til medlemmerne af classA.

I ClassBhar vi oprettet en funktion, add()der returnerer summen af ​​numA og numB.

Da det ClassBer en vensklasse, kan vi oprette objekter ClassAinden i ClassB.

Interessante artikler...