Amies de classes

De Appmethod Topics
Aller à : navigation, rechercher

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