Fonctions amies
De part l’encapsulation des données, les fonctions extérieures à une classe n’ont pas accès aux membres privés de cette classe… à l’exception des fonctions amies.
En effet en déclarant une fonction amie d’une classe A
, cette fonction a accès
à tous les membres de A
, tout comme le ferait une méthode de A
.
La “déclaration d’amitié” permet donc de déclarer dans une classe, les fonctions que l’on autorise à accéder à ses membres privés. Conceptuellement, cette notion va à l’encontre de l’encapsulation des données; les fonctions amies ne sont jamais indispensables, elles sont juste pratiques.
La syntaxe fait intervenir le mot clé friend
et l’on distingue trois cas de
figures selon la nature de la fonction
Fonction extérieure amie d’une classe
A
class A { ... friend type nom_fonction_extérieure(...); ... };
Fonction membre d’une classe
B
, amie de la classeA
class A { ... friend type B::nom_méthode_de_A(...); ... };
Toutes les méthodes d’une classe
B
sont amies de la classeA
class A { ... friend class B; ... };
Remarques :
- On déclare souvent une fonction amie d’une classe
A
lorsque la fonction amie renvoie un objet de la classeA
- Il est parfois nécessaire d’indiquer au compilateur que la déclaration de la
classe n’interviendra que plus loin dans le code. Dans ce cas, il faut user
d’une déclaration “en amont” (forward declaration en anglais) via
l'instruction
class nom_classe;
- Si deux classes
A
etB
sont amies, les objet deA
ne peuvent pas accéder aux membres deB
. Ce sont les méthodes deA
qui peuvent accéder aux membres deB