Fonctions et classes de membre de classe comme friends
Les fonctions membres de classe peuvent être déclarées comme friends dans d'autres classes.Prenons l'exemple suivant :
// classes_as_friends1.cpp
// compile with: /c
class B;
class A {
public:
int Func1( B& b );
private:
int Func2( B& b );
};
class B {
private:
int _b;
// A::Func1 is a friend function to class B
// so A::Func1 has access to all members of B
friend int A::Func1( B& );
};
int A::Func1( B& b ) { return b._b; } // OK
int A::Func2( B& b ) { return b._b; } // C2248
Dans l'exemple précédent, seule la fonction A::Func1( B& ) se voit octroyer l'accès ami à la classe B.par conséquent, l'accès au membre privé _b est correct dans Func1de classe Amais pas dans Func2.
Une classe d' friend est une classe toute lequel les fonctions membres sont des fonctions friend d'une classe, c. autrement dit., dont les fonctions membres ont accès aux autres membres privés et protégés de la classe.supposez que la déclaration d' friend dans la classe B avait été :
friend class A;
Dans ce cas, toutes les fonctions membres dans la classe A auraient été accordées d'accès ami à la classe B.Le code suivant est un exemple d'une classe de fonction friend :
// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class YourClass {
friend class YourOtherClass; // Declare a friend class
public:
YourClass() : topSecret(0){}
void printMember() { cout << topSecret << endl; }
private:
int topSecret;
};
class YourOtherClass {
public:
void change( YourClass& yc, int x ){yc.topSecret = x;}
};
int main() {
YourClass yc1;
YourOtherClass yoc1;
yc1.printMember();
yoc1.change( yc1, 5 );
yc1.printMember();
}
L'amitié n'est pas mutuelle à moins qu'explicitement spécifiée en tant que tel.Dans l'exemple ci-dessus, les fonctions membre d' YourClass ne peuvent pas accéder aux membres privés d' YourOtherClass.
Un type managé ne peut pas avoir de fonctions friend, les classes de fonction friend, ou interfaces friend.
L'amitié n'est pas héritée, ce qui signifie que les classes dérivées d' YourOtherClass ne peuvent pas accéder aux membres privés des entity_YourClass.L'amitié n'est pas transitive, les classes qui sont des fonctions friend d' YourOtherClass ne peuvent pas accéder aux membres privés des entity_YourClass.
l'illustration suivante montre quatre déclarations de classe : Base, Derived, aFriend, et anotherFriend.Seule la classe aFriend a un accès direct aux membres privés d' Base (et à tous les membres Base peut être hérité).
Conséquences de relation " friend "