En P.O.O. "l'unité de protection" est la classe, les données membre ne sont accessibles que par les fonctions membre de cette même classe(quelles soient publiques ou privée). Mais les autres fonctions ou fonctions membre des autres classes ne peuvent accéder directement à ces données membre. Une telle contrainte peut devenir gênante dans certain cas. En effet l'accès aux données membre d'une classe par une fonction membre d'une autre classe ou par une fonctions définit par l'utilisateur peut s'avérait utile.
Supposons l'existence d'une classe vecteur et d'une classe matrice, nous voulons effectuer la multiplication d'une matrice par un vecteur. Si la fonction est une fonction membre de la classe matrice elle ne pourras accéder aux données membre de la classe vecteur(et inversement). Une solution simpliste et totalement dépourvue de raison serai de déclaré publique les données membre de l'une des deux classes. La solution la plus approprié est la définition d'une "fonction amie", mot clé friend.
Une fonction "amie" est une fonction qui a la possibilité d'accédé aux données membre d'une classe sans être une fonction membre de cette même classe. Une fonction est déclarée "amie" dans la définition de la classe. C'est donc aux niveaux de la classe que se déclare l'amitié, on se s'impose pas "amie d'une classe".
Nous verrons qu'il existe plusieurs situation d'amitié avec une classe :
- fonction indépendante, amie d'une classe,
- fonction membre d'une classe, amie d'une autre classe,
- fonction amie de plusieurs classes,
- toutes les fonctions membre d'une classe, amies d'une autre classe.
Nous allons étudier chacun de ces cas ainsi que l'influence de l'amitié sur l'exploitation des classes.