Fonctions et classes amies

On a vu dans le cours intitulé Encapsulation des données qu’on peut décider celui qui a le droit d’accéder aux données d’une classe. En les rendant publiques, elles sont accessibles par tout le monde. En les rendant protégées, seules les fonctions de la classe et celles des héritiers peuvent accéder. Et en les rendant privées, seules les fonctions de la classe ont le droit d’accès.

Mais là, on ne vous a pas tout dit. Eh oui ! Il peut y avoir une exception même si les données sont privées. Et c’est cette exception qui nous intéresse dans ce cours.

Fonctions amies

Comme on l’a dit ci-haut, les données privées d’une classe, seules les fonctions membres y ont accès. Cependant, on peut faire en sorte que ces données soient accessibles par une ou plusieurs fonctions depuis l’extérieur : il suffit de déclarer une fonction amie.

Une fonction amie d’une classe, bien qu’elle ne soit pas membre de cette classe, a le droit d’accéder à tous les données de cette classe (données publiques, protégées ou privées). Elle a même le droit d’y apporter des modifications.

Pour déclarer l’amitié, on utilise le mot-clé friend.

Voici la syntaxe de la déclaration d’une fonction amie :
friend type-de-retour nom-de-la-classe :: fonction (args);

Exemple :

Classes amies

Une classe amie à une classe, est une classe qui doit avoir accès à toutes les méthodes de la classe avec laquelle elle est amie.
Pour plus de clarté, si la classe A est amie de la classe B cela signifie que A doit avoir accès à toutes les méthodes de B.

Pour déclarer une classe amie, voici la syntaxe :
friend class nom-de-la-classe-amie ;

La déclaration de la classe amie doit se faire à l’intérieur de la classe cible.

Exemple :

En POO, l’amitié c’est comme dans la vraie vie

  • Si A est amie de B, cela ne signifie pas que B est amie de A.
  • Le fait que A soit amie de B, cela ne signifie pas que les amies de A sont des amis de B.
  • Si A est amie de B, cela ne signifie pas que les héritiers de A peuvent avoir accès aux méthodes de B.


Une question? Cliquez ici pour la poser.

Retour sur le portail du langage C/C++