C ++ vennefunksjoner og klasser (med eksempler)

I denne opplæringen lærer vi å lage vennefunksjoner og venneklasser i C ++ ved hjelp av eksempler.

Datahulling er et grunnleggende konsept med objektorientert programmering. Det begrenser tilgangen til private medlemmer utenfor klassen.

På samme måte har beskyttede medlemmer bare tilgang til avledede klasser og er utilgjengelige utenfra. For eksempel,

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

Imidlertid er det en funksjon i C ++ som kalles vennefunksjoner som bryter denne regelen og lar oss få tilgang til medlemsfunksjoner utenfor klassen.

På samme måte er det også en venneklasse , som vi vil lære senere i denne opplæringen.

venn Funksjon i C ++

En vennefunksjon kan få tilgang til de private og beskyttede dataene til en klasse. Vi erklærer en vennfunksjon ved å bruke friendnøkkelordet inne i klassen.

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

Eksempel 1: Working of friend Funksjon

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

Produksjon

 Avstand: 5

Her addFive()er en vennefunksjon som kan få tilgang til både private og offentlige datamedlemmer.

Selv om dette eksemplet gir oss en ide om begrepet en vennfunksjon, viser det ingen meningsfull bruk.

En mer meningsfull bruk ville være å operere på gjenstander i to forskjellige klasser. Det er da vennefunksjonen kan være veldig nyttig.

Eksempel 2: Legg til medlemmer i to forskjellige 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; )

Produksjon

 Sum: 13

I dette programmet, ClassAog ClassBhar erklært add()som en vennfunksjon. Dermed kan denne funksjonen få tilgang til private data fra begge klasser.

En ting å legge merke til her er vennefunksjonen inne ClassAved å bruke ClassB. Vi har imidlertid ikke definert ClassBpå dette punktet.

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

For at dette skal fungere, trenger vi en videre erklæring om ClassBi vårt program.

 // forward declaration class ClassB;

venneklasse i C ++

Vi kan også bruke en venneklasse i C ++ ved å bruke friendnøkkelordet. For eksempel,

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

Når en klasse blir erklært som en venneklasse, blir alle medlemsfunksjonene i venneklassen vennefunksjoner.

Siden classBer en venneklasse, kan vi få tilgang til alle medlemmene classAfra innsiden classB.

Imidlertid kan vi ikke få tilgang til medlemmer ClassBfra innsiden classA. Det er fordi venneforholdet i C ++ bare er gitt, ikke tatt.

Eksempel 3: C ++ venneklasse

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

Produksjon

 Sum: 13

Her ClassBer en venneklasse av ClassA. Så, ClassBhar tilgang til medlemmene av classA.

I ClassBhar vi opprettet en funksjon add()som returnerer summen av numA og numB.

Siden ClassBer en venneklasse, kan vi lage objekter av ClassAinnsiden av ClassB.

Interessante artikler...