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 friend
parola 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 ClassA
e ClassB
hanno 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 ClassA
utilizza l'estensione ClassB
. Tuttavia, non abbiamo definito ClassB
a questo punto.
// inside classA friend int add(ClassA, ClassB);
Affinché ciò funzioni, abbiamo bisogno di una dichiarazione anticipata ClassB
nel nostro programma.
// forward declaration class ClassB;
Classe amico in C ++
Possiamo anche usare una classe amico in C ++ usando la friend
parola 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 classA
dall'interno classB
.
Tuttavia, non possiamo accedere ai membri di ClassB
dall'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 ClassB
una classe di amici di ClassA
. Quindi, ClassB
ha 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 ClassA
all'interno di ClassB
.