La surcharge des opérateurs
 
(où l'on ajoute des points)
 
 
 
 
 
 

On aimerait pouvoir définir une addition sur les points:
 
 
 

Point p1,p2; Point p=p1+p2;
 
 
 

où l'addition sur les points donnerait pour p un point de position correspondant à la somme des 2 abcisses et des 2 ordonnées.
 
 
 
 
 

Il s'agit ici d'une nouvelle forme de polymorphisme (ou de surcharge)  mais portant ici non plus sur des fonctions, mais sur des opérateurs utilisés usuellement dans le langage. C++ permet une telle redéfinition . Il existe même deux approches possibles:
 
 
 
 
 
 
 
 
 
 
 
 
 
 

1) Utiliser une fonction membre de la classe

Class Point {

float x,y;

public:

Point( float x0, float y0) { x=x0; y=y0;}

Point operator+( Point &p2) {
return Point(x+p2.x,y+p2.y);
}

};

On utilise l'opérateur + comme spécifié ci-dessus.
 

On remarque que dans la liste d'arguments de l'opérateur +, il n'y a qu'un argument au lieu de deux (toujours un argument de moins si l'opérateur est défini par une fonction membre). En fait, le premier argument est déja connu, c'est celui sur lequel pointe le pointeur *this .
 

Que se passe-t-il réellement quand on écrit p=p1 + p2; ?

en fait, on exécute    p=p1.operator+(p2);
 

On voit que le traitement des deux arguments n'est pas du tout symétrique, ce qui peut occasionner de sérieux désagréments: une addition peut être définie dans un sens et pas dans l'autre, par exemple dans le cas où une conversion de type est nécessaire pour le deuxième argument.
 

Néanmoins, l'approche par la fonction membre est la seule possible pour les opérateurs suivants:
 

- l'opérateur d'affectation =
- l'opérateur d'indiçage []
- l'opérateur fonction ()
- l'opérateur d'indirection ->
- les opérateurs de conversion de type
 
 
 
 
 
 
 
 

 

2) Utiliser une fonction friend (n'appartenant donc pas à la classe)

En général, l'approche par la fonction friend évite les mauvaises surprises en traitant les deux arguments de manière symétrique.

class Point {
friend Point operator+(  Point &p1, Point &p2);
float x,y;

public:
Point( float x0, float y0) { x=x0; y=y0;}

};
 
 
 

inline Point operator+(Point &p1, Point &p2) {
return Point(p1.x+p2.x,p1.y+p2.y);
}
 
 

Que se passe-t-il réellement quand on écrit p=p1 + p2; ?

en fait, on exécute    p=operator+(p1,p2);
 

On peut ainsi redéfinir d'autres opérateurs, comme - , * , /, ==, ++, +=, <            (la liste n'est pas exhaustive)

Drupal 7 Appliance - Powered by TurnKey Linux