Académique Documents
Professionnel Documents
Culture Documents
Surcharge d’opérateurs
Laila AMIR
Plan
2 Surcharge d’opérateurs
Les opérateurs que l’on peut surcharger
Surcharge des opérateurs externes
Surcharge des opérateurs internes
Choisir entre surcharge interne ou externe?
Plan
2 Surcharge d’opérateurs
Les opérateurs que l’on peut surcharger
Surcharge des opérateurs externes
Surcharge des opérateurs internes
Choisir entre surcharge interne ou externe?
Plan
2 Surcharge d’opérateurs
Les opérateurs que l’on peut surcharger
Surcharge des opérateurs externes
Surcharge des opérateurs internes
Choisir entre surcharge interne ou externe?
mot-clé friend
mot-clé friend
Situations d’amitié
class Point {
int x; int y;
public:
Point(int a, int b) { x = a; y = b; };
friend int coincide(Point, Point);
};
int coincide(Point p, Point q) {
if ((p.x==q.x)&&(p.y==q.y)) return 1 ;
else return 0 ;
}
class B {
class A {
...
//Partie privée
int fct(char, A);
...
};
//Partie publique
int B::fct(char c, A a){
...
//accès aux membres privés de A
friend int B::fct(char, A);
...
};
};
class A;
class B {
int fct(char, A);
};
class A {
...
friend int B::fct(char, A);
};
int B::fct(char c, A a){
//accès aux membres privés de A
...
};
class A { class B {
//Partie privée //Partie privée
... ...
//Partie publique //Partie publique
friend int fct(A, B); friend int fct(A, B);
}; };
int fct(A a, B b){
//accès aux membres privés des objets de type A ou B
};
classe amie
Plan
2 Surcharge d’opérateurs
Les opérateurs que l’on peut surcharger
Surcharge des opérateurs externes
Surcharge des opérateurs internes
Choisir entre surcharge interne ou externe?
Surcharge d’opérateurs
class Point {
int x; int y;
public:
Point(int abs=0, int ord=0) { x = abs; y = ord; };
friend Point operator + (Point, Point);
void affiche (){cout<<”coordonnées :”<<x<<” ”<<y<<endl; };
};
Point operator + (Point a, Point b) {
Point p;
p.x = a.x + b.x; p.y = a.y + b.y;
return p;
}
main(){ Résultat :
Point a(1,2); a.affiche();
Point b(2,5); b.affiche(); coordonnées : 1 2
Point c; coordonnées : 2 5
c = a+b; c.affiche(); coordonnées : 3 7
}
main(){ Résultat :
Point a(1,2); a.affiche();
Point b(2,5); b.affiche(); coordonnées : 1 2
Point c; coordonnées : 2 5
c = a+b; c.affiche(); coordonnées : 3 7
}
class Point {
int x; int y;
public:
Point(int abs=0, ord b=0) { x = abs; y = ord; };
Point operator + (Point);
void affiche (){cout<<”coordonnées :”<<x<<” ”<<y<<endl; };
};
Point Point::operator + (Point b) {
Point p;
p.x = x + b.x; p.y = y + b.y;
return p;
}
main(){ Résultat :
Point a(1,2); a.affiche();
Point b(2,5); b.affiche(); coordonnées : 1 2
Point c; coordonnées : 2 5
c = a+b; c.affiche(); coordonnées : 3 7
}
Mais une expression telle que f= a+b+c est évaluée différement selon
le compilateur :
T T::operator+(const T&a)
Etudions les rôles respectifs de l’argument par défaut this et de l’argument
explicite a. Dans une addition, aucun des deux membres n’est
modifié et le résultat n’est ni le membre de gauche, ni celui de droite : en
fait les deux arguments jouent un rôle absolument symétrique.
De ce fait, this n’a pas un rôle privilégié par rapport à a et l’opérateur est
alors transformé en fonction externe, soit :
interne ?
externe?
Déclaration à l’extérieur d’une classe : surcharge externe (à 2 arguments)
Récapitulatif