Lorsquon crée une nouvelle classe, il se peut que certaines actions correspondent intuitivement à un concept dopé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 , 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 :
De plus, la fonction somme
est supposée avoir été déclarée amie de la classe, puisquelle en utilise les membres.
Lorsquon 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 nest 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
Cest ce que permet la redéfinition dopérateurs.
Précédent | Sommaire | Suivant |