Amies de classes
Remonter à Classes - Index
Une friend F de la classe X est une fonction ou une classe qui, bien que n'étant pas fonction membre de X, dispose des droits d'accès complets aux membres privés et protégés de X. Mais en ce qui concerne la portée, les déclarations et les définitions, F est une fonction normale.
Puisque F n'est pas un membre de X, elle n'est pas dans la portée de X et ne peut être appelée via les opérateurs de sélection x.F et xptr>F (x étant un objet de X et xptr un pointeur sur un objet de X).
Si le spécificateur friend est utilisé dans une déclaration ou une définition de fonction à l'intérieur de la classe X, la fonction devient une amie de X.
Les fonctions friend définies dans une classe suivent les mêmes règles inline que les fonctions membres (voir Fonctions Inline). Les fonctions friend ne sont pas affectées par leur position dans la classe, ni par les spécificateurs d'accès. Par exemple :
class X {
int i; // private par rapport à X
friend void friend_func(X*, int);
/* friend_func n'est pas private bien qu'elle soit déclarée dans la partie private */
public:
void member_func(int);
};
/* définitions; remarquez que les deux fonctions ont un accès private à int i */
void friend_func(X* xptr, int a) { xptr–>i = a; }
void X::member_func(int a) { i = a; }
X xobj;
/* remarquez la différence au niveau des appels de fonction */
friend_func(&xobj, 6);
xobj.member_func(6);
Vous pouvez faire de toutes les fonctions de la classe Y des amies de la classe X à l'aide d'une seule déclaration :
class Y; // déclaration incomplète
class X {
friend Y;
int i;
void member_funcX();
};
class Y; { // complète la déclaration
void friend_X1(X&);
void friend_X2(X*);
.
.
.
};
Les fonctions déclarées dans Y sont des amies de X, bien qu'aucun spécificateur friend ne leur soit associé. Elles ont accès aux membres privés de X, comme i et member_funcX.
Il est possible pour une fonction membre spécifique de la classe X d'être une amie de la classe Y :
class X {
.
.
.
void member_funcX();
}
class Y {
int i;
friend void X::member_funcX();
.
.
.
};
L'amitié d'une classe n'est pas transitive : X amie de Y et Y amie de Z n'impliquent pas X amie de Z. L'amitié n'est pas héritée.
Voir aussi
- Classes C++
- Noms de classes
- Types de classes
- Portée du nom de classe
- Objets de classes
- Liste des membres de classe
- Fonctions membres
- Mot clé This
- Membres statiques (C++)
- Fonctions inline
- Portée des membres
- Déclarations de types imbriqués
- Contrôle d'accès aux membres
- Accès aux classes de base et dérivées
- Classes de base virtuelles
- Amies de classes