Académique Documents
Professionnel Documents
Culture Documents
Master SEIB
Azzedine DLIOU
École Nationale des Sciences Appliquées
Université Ibn Zohr
2020-2021
Sommaire
1 Introduction
2 Fonction indépendante amie d’une classe
3 Fonction membre d’une classe amie d’une autre classe
4 Fonction amie de plusieurs classes
5 Toutes les fonctions d’une classe amies d’une autre classe
6 Exemples
Introduction
Exemple
#include <iostream>
using namespace std ;
class point{
int x, y ;
public :
point (int abs=0, int ord=0){ x=abs ; y=ord ; }
friend bool coincide (const point &, const point &) ;
} ;
bool coincide (const point &p, const point &q){
return ((p.x == q.x) && (p.y == q.y)) ;
}
int main(){
point a(1,0), b(1), c ;
if (coincide (a,b)) cout << "a coincide avec b \n" ;
else cout << "a et b sont differents \n" ;
if (coincide (a,c)) cout << "a coincide avec c \n" ;
else cout << "a et c sont differents \n" ;
}
Fonction indépendante amie d’une classe
Application
Résultat
a coincide avec b
a et c sont differents
Remarques
1 L’emplacement de la déclaration d’amitié au sein de la classe point
est absolument indifférent.
2 Nous n’avons plus d’argument implicite (this) dans notre cas ici.
3 Les deux arguments de coincide sont transmis par valeur. Ils pour-
raient l’être par référence ;
(NB : Dans le cas d’une fonction membre, l’objet appelant la fonction
est d’office transmis par référence (sous la forme de this)).
Fonction membre d’une classe amie d’une autre classe
Remarques
1- Pour compiler convenablement les déclarations d’une classe A conte-
nant une déclaration d’amitié telle que :
friend int B : :f(char, A) ;
le compilateur a besoin de connaître les caractéristiques de B ; cela
signifie que la déclaration de B devra avoir été compilée avant celle
de A.
2- En revanche, pour compiler convenablement la déclaration :
int f(char, A)
figurant au sein de la classe B, le compilateur n’a pas besoin de
connaître précisément les caractéristiques de A. Il lui suffit de savoir
qu’il s’agit d’une classe.
On peut fournir l’information voulue au compilateur en faisant précé-
der la déclaration de B de :
class A ;
Fonction membre d’une classe amie d’une autre classe
Remarques suite
3- La compilation de la définition de la fonction f nécessite, en général,
la connaissance des caractéristiques des classes A et B ; leurs décla-
rations devront donc apparaître avant.
Par exemple :
class A ;
class B{
.....
int f(char, A) ;
.....
} ;
class A{
.....
friend int B::f(char, A) ;
.....
} ;
int B::f(char..., A...){ ..... }
Fonction amie de plusieurs classes
Une fonction (indépendante ou membre) peut faire l’objet de décla-
rations d’amitié dans différentes classes. Par exemple :
Classe A Classe B
class A{ class B{
// partie privée // partie privée
..... .....
// partie publique // partie publique
friend void f(A, B) ; friend void f(A, B) ;
..... .....
}; };
Fonction f
void f(A..., B...)
{
// on a accès ici aux membres privés
// de n’importe quel objet de type A ou B
}
Fonction amie de plusieurs classes
Remarques
1 La déclaration de A peut être compilée sans celle de B, en la faisant
précéder de la déclaration :
class B ;
2 De même, la déclaration de B peut être compilée sans celle de A, en
la faisant précéder de la déclaration :
class A ;
3 Si l’on compile en même temps les deux déclarations de A et B, il
faudra utiliser l’une des deux déclarations citées (class A si B figure
avant A, class B sinon).
4 La compilation de la définition de f nécessitera généralement les dé-
clarations de A et de B.
Toutes les fonctions d’une classe amies d’une autre classe
Remarques
1 Pour compiler la déclaration de la classe A, il suffira de la faire précéder
de :
class B ;
2 Ce type de déclaration d’amitié évite de fournir les en-têtes des fonc-
tions concernées.
Exemples
Fonction amie indépendante