Funzioni e classi Friend C ++ (con esempi)

In questo tutorial impareremo a creare funzioni di amicizia e classi di amici in C ++ con l'aiuto di esempi.

L'occultamento dei dati è un concetto fondamentale della programmazione orientata agli oggetti. Limita l'accesso dei membri privati ​​dall'esterno della classe.

Allo stesso modo, i membri protetti sono accessibili solo dalle classi derivate e sono inaccessibili dall'esterno. Per esempio,

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

Tuttavia, esiste una funzionalità in C ++ chiamata funzioni amico che infrange questa regola e ci consente di accedere alle funzioni membro dall'esterno della classe.

Allo stesso modo, c'è anche una classe di amici , che impareremo più avanti in questo tutorial.

Funzione amico in C ++

Una funzione amico può accedere ai dati privati e protetti di una classe. Dichiariamo una funzione amico utilizzando la friendparola chiave all'interno del corpo della classe.

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

Esempio 1: funzionamento della funzione amico

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

Produzione

 Distanza: 5

Ecco addFive()una funzione amico che può accedere a membri di dati sia privati che pubblici .

Sebbene questo esempio ci dia un'idea sul concetto di una funzione amico, non mostra alcun uso significativo.

Un uso più significativo sarebbe operare su oggetti di due classi differenti. È allora che la funzione amico può essere molto utile.

Esempio 2: aggiungere membri di due classi diverse

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

Produzione

 Somma: 13

In questo programma ClassAe ClassBhanno dichiarato add()come funzione amico. Pertanto, questa funzione può accedere ai dati privati di entrambe le classi.

Una cosa da notare qui è che la funzione amico all'interno ClassAutilizza l'estensione ClassB. Tuttavia, non abbiamo definito ClassBa questo punto.

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

Affinché ciò funzioni, abbiamo bisogno di una dichiarazione anticipata ClassBnel nostro programma.

 // forward declaration class ClassB;

Classe amico in C ++

Possiamo anche usare una classe amico in C ++ usando la friendparola chiave. Per esempio,

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

Quando una classe viene dichiarata una classe amico, tutte le funzioni membro della classe amico diventano funzioni amico.

Poiché classBè una classe di amici, possiamo accedere a tutti i membri di classAdall'interno classB.

Tuttavia, non possiamo accedere ai membri di ClassBdall'interno classA. È perché la relazione di amicizia in C ++ è solo garantita, non accettata.

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

Produzione

 Somma: 13

Ecco ClassBuna classe di amici di ClassA. Quindi, ClassBha accesso ai membri di classA.

In ClassB, abbiamo creato una funzione add()che restituisce la somma di numA e numB.

Poiché ClassBè una classe di amici, possiamo creare oggetti ClassAall'interno di ClassB.

Articoli interessanti...