Vous êtes sur la page 1sur 6

COURS/TP DE LANGAGE C

- 163-
CHAPITRE 14
FONCTIONS AMIES
Grce aux Ionctions amies, on pourra acceder aux membres prives d`une classe, autrement
que par le biais de ses Ionctions membres.
Il existe plusieurs situations d`amitie:
- Une Ionction independante est amie d`une ou de plusieurs classes.
- Une ou plusieurs Ionctions membres d`une classe sont amie d`une autre classe.
I- FONCTION INDEPENDANTE AMIE D'UNE CLASSE
Exemple (a tester) et exercice XIV-1:
Dans l`exemple ci-dessous, la Ionction FRwQFLGH est AMIE de la classe SRLQW C`est une
Ionction ordinaire qui peut manipuler les membres prives de la classe SRLQW.
#include <iostream.h> //fonction independante, amie d'une classe
#include <conio.h>
class point

int x,y;
public:
point(int abs0,int ord0)xabs;yord;]
friend int coincide(point,point); //declaration de la fonction amie
];
int coincide(point p,point q)
if((p.xq.x)&&(p.yq.y))return 1;else return 0;]
void main()
point a(4,0),b(4),c;
if(coincide(a,b))cout<<"a coincide avec b\n";
else cout<<"a est different de b\n";
if(coincide(a,c))cout<<"a coincide avec c\n";
else cout<<"a est different de c\n";
getch() ;]
Exercice XIV-2:
Reprendre l`exercice III-8 dans lequel une Ionction membre de la classe vecteur permettait de
calculer le determinant de deux vecteurs:
DeIinir cette Iois-ci une Ionction independante AMIE de la classe vecteur.
COURS/TP DE LANGAGE C
- 164-
II- LES AUTRES SITUATIONS D'AMITIE
1- Dans la situtation ci-dessous, la Ionction fm_de_titi, Ionction membre de la classe TITI, a
acces aux membres prives de la classe TOTO:
class TOTO

// partie prive
........
// partie publique
friend int TITI::fm_de_titi(char, TOTO);
];
class TITI

........
int fm_de_titi(char, TOTO);
];
int TITI::fm_de_titi(char c, TOTO t)
... ] // on pourra trouver ici une invocation des membres privs de l`objet t
Si toutes les Ionctions membres de la classe TITI etaient amies de la classe TOTO, on
declarerait directement dans la partie publique de la classe TOTO: friend class TITI;
2- Dans la situation ci-dessous, la Ionction f_anonyme a acces aux membres prives des
classes TOTO et TITI:
class TOTO

// partie prive
........
// partie publique
friend void f_anonyme(TOTO, TITI);
];
class TITI

// partie prive
........
// partie publique
friend void f_anonyme(TOTO, TITI);
];
void f_anonyme(TOTO to, TITI ti)
... ] // on pourra trouver ici une invocation des membres privs des objets to et ti.
COURS/TP DE LANGAGE C
- 165-
III- APPLICATION A LA SURDEFINITION DES OPERATEURS
Exemple (a tester) et exercice XIV-3:
On reprend l`exemple V-1 permettant de surdeIinir l`operateur pour l`addition de 2
vecteurs.
On cree, cette Iois-ci, une Ionction AMIE de la classe vecteur.
#include <iostream.h>
#include <conio.h>
// Classe vecteur
// Surdefinition de l'operateur + par une fonction AMIE
class vecteur
float x,y;
public: vecteur(float,float);
void affiche();
friend vecteur operator+(vecteur, vecteur);
];
vecteur::vecteur(float abs 0,float ord 0)
xabs;yord;]
void vecteur::affiche()
cout<<"x "<<x<<" y "<<y<<"\n";]
vecteur operator+(vecteur v, vecteur w)
vecteur res;
res.x v.x + w.x;
res.y v.y + w.y;
return res;]
void main()
vecteur a(2,6),b(4,8),c,d;
c a + b; c.affiche();
d a + b + c; d.affiche();getch() ;]
Exercice XIV-4:
Reprendre l`exercice XIV-1: redeIinir l`operateur correspondant a la Ionction concide.
Exercice XIV-5:
Reprendre les exercices V-2, V-3 et V-4: En utilisant la propriete de surdeIinition des
Ionctions du C, creer
- une Ionction membre de la classe vecteur de prototype
float vecteur::operator*(vecteur); qui retourne le produit scalaire de 2 vecteurs
- une Ionction membre de la classe vecteur de prototype
vecteur vecteur::operator*(float); qui retourne le vecteur produit d`un vecteur et d`un reel
(donne une signiIication a v2 v1 * h;)
COURS/TP DE LANGAGE C
- 166-
- une Ionction AMIE de la classe vecteur de prototype
vecteur operator*(float, vecteur); qui retourne le vecteur produit d`un reel et d`un vecteur
(donne une signiIication a v2 h * v1;)
On doit donc pouvoir ecrire dans le programme:
vecteur v1, v2, v3, v4;
float h, p;
p v1 * v2;
v3 h * v1;
v4 v1 * h;
Remarque:
On aurait pu remplacer la Ionction membre de prototype vecteur vecteur::operator*(float);
par une Ionction AMIE de prototype vecteur operator*(vecteur, float);
Exercice XIV-6:
Etudier le listing du Iichier d`en-tte complex.h Iourni au chapitre V et justiIier tous les
prototypes des Ionctions.
IV- CORRIGE DES EXERCICES
Exercice XIV-2:
#include <iostream.h>
#include <conio.h>
// Classe vecteur
// Fonction AMIE permettant de calculer le dterminant de 2 vecteurs
class vecteur
float x,y;
public: vecteur(float,float);
void affiche();
friend float det(vecteur, vecteur);
];
vecteur::vecteur(float abs 0.,float ord 0.)
xabs;yord;]
void vecteur::affiche()
cout<<"x "<<x<<" y "<<y<<"\n";]
float det(vecteur a, vecteur b) // la fonction AMIE peut manipuler
// les quantits b.x, b.y, a.x, a.y
float res;
res a.x * b.y - a.y * b.x;
return res;
]
COURS/TP DE LANGAGE C
- 167-
void main()
vecteur u(2,6),v(4,8);
u.affiche(); v.affiche();
cout <<"Determinant de (u,v) "<<det(u,v)<<"\n";
cout <<"Determinant de (v,u) "<<det(v,u)<<"\n";getch() ;]
Exercice XIV-4:
#include <iostream.h> //Surdfinition de l'oprateur
class point

int x,y;
public:
point(int abs0,int ord0)xabs;yord;]
friend int operator(point,point); //declaration de la fonction amie
];
int operator(point p,point q)
if((p.xq.x)&&(p.yq.y))return 1;else return 0;]
void main()

point a(4,0),b(4),c;
if(ab)cout<<"a coincide avec b\n";
else cout<<"a est different de b\n";
if(ac)cout<<"a coincide avec c\n";
else cout<<"a est different de c\n";
getch() ;]
Exercice XIV-5:
#include <iostream.h>
#include <conio.h>
class vecteur
float x,y;
public: vecteur(float,float);
void affiche();
vecteur operator+(vecteur); // surdefinition de l'operateur +
float operator*(vecteur); // surdefinition de l'operateur
// produit scalaire
vecteur operator*(float); // surdefinition de l'homotethie
friend vecteur operator*(float,vecteur);//surdefinition de l'homotethie
];
vecteur::vecteur(float abs 0,float ord 0)
xabs;yord;]
COURS/TP DE LANGAGE C
- 168-
void vecteur::affiche()
cout<<"x "<<x<<" y "<<y<<"\n";]
vecteur vecteur::operator+(vecteur v)
vecteur res; res.x v.x + x; res.y v.y + y; return res;]
float vecteur::operator*(vecteur v)
float res;res v.x * x + v.y * y;return res;]
vecteur vecteur::operator*(float f)
vecteur res; res.x f*x; res.y f*y; return res;]
vecteur operator*(float f, vecteur v)
vecteur res; res.x f*v.x; res.y f*v.y; return res;]
void main()
vecteur a(2,6),b(4,8),c,d;
float p,h2.0;
p a * b;
cout<<p<<"\n";
c h * a;
c.affiche();
d a * h;
d.affiche();
getch() ;]