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 friend
nø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, ClassA
og ClassB
har 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 ClassA
ved å bruke ClassB
. Vi har imidlertid ikke definert ClassB
på dette punktet.
// inside classA friend int add(ClassA, ClassB);
For at dette skal fungere, trenger vi en videre erklæring om ClassB
i vårt program.
// forward declaration class ClassB;
venneklasse i C ++
Vi kan også bruke en venneklasse i C ++ ved å bruke friend
nø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 classB
er en venneklasse, kan vi få tilgang til alle medlemmene classA
fra innsiden classB
.
Imidlertid kan vi ikke få tilgang til medlemmer ClassB
fra 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 ClassB
er en venneklasse av ClassA
. Så, ClassB
har tilgang til medlemmene av classA
.
I ClassB
har vi opprettet en funksjon add()
som returnerer summen av numA og numB.
Siden ClassB
er en venneklasse, kan vi lage objekter av ClassA
innsiden av ClassB
.