Partager via


Fonctions membres de classe et classes en tant que friends

Les fonctions membres de classe peuvent être déclarées en tant que 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 un accès ami à la classe B. Par conséquent, l'accès au membre privé _b est correct dans Func1 de la classe A , mais pas dans Func2.

Une classe friend est une classe dont toutes les fonctions membres sont des fonctions friend d'une classe. Autrement dit, les fonctions membres ont accès aux membres privés et protégés de l'autre classe. Supposez que la déclaration friend dans la classe B ait été :

friend class A;

Dans ce cas, toutes les fonctions membres dans la classe A auraient bénéficié d'un accès ami à la classe B. Le code suivant est un exemple d'une classe 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'elle soit spécifiée explicitement comme telle. Dans l'exemple ci-dessus, les fonctions membres de YourClass ne peuvent pas accéder aux membres privés de YourOtherClass.

Un type managé ne peut pas avoir de fonctions, de classes ou d'interfaces friend.

L'amitié n'est pas héritée, ce qui signifie que les classes dérivées de YourOtherClass ne peuvent pas accéder aux membres privés de YourClass. L'amitié n'est pas transitive, par conséquent les classes qui sont des amis de YourOtherClass ne peuvent pas accéder aux membres privés de 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 de Base (et à tous les membres dont Base peut avoir hérité).

Implications des relations friend

Implications des relations d'amitié

Voir aussi

Référence

friend (C++)