Redéfinition d’opérateurs

Lorsqu’on crée une nouvelle classe, il se peut que certaines actions correspondent intuitivement à un concept d’opération.

Imaginons par exemple une classe fraction qui gère des nombres fractionnaires non sous leur forme à virgule flottante, mais sous leur forme plus mathématique de quotient de deux nombres entiers :

class fraction {     long num, den;        // numérateur, dénominateur     public :     fraction(long numer, long denom = 1)         { num = numer; den = denom; }     };

Un élément de la classe « représente » donc la valeur num/den, mathématiquement parlant. De ce fait, il est naturel de définir par exemple une addition sur de tels nombres :

inline fraction somme(fraction f1, fraction  f2){     return fraction(f1.num*f2.den + f1.den*f2.num,                     f2.den*f1.den);}

On a bien sûr utilisé la formule :

somme fractions

De plus, la fonction somme est supposée avoir été déclarée amie de la classe, puisqu’elle en utilise les membres.

Lorsqu’on utilise ces fractions, il faut alors écrire :

fraction f1(2, 5), f2 = 4;   // f1 =  2/5, f2 = 4/1f3 = somme(f1, f2);          // f3 = 4 +2/5 = 22/5f3 = somme(f3, -6);          // f3 = 22/5 -6 = -8/5

ce qui n’est pas extrêmement pratique. Il paraît relativement naturel d’écrire plutôt :

fraction f1(2, 5), f2 = 4;     // f1 =  2/5, f2 = 4/1f3 = f1 + f2 - 6;              // f3 = 4 +2/5 -6 = -8/5

C’est ce que permet la redéfinition d’opérateurs.

Précédent Précédent Sommaire Sommaire Suivant Suivant