Opérateurs sur de nouvelles classes

Nous allons définir les quatre opérations de base pour la classe fraction. Pour cela, il suffit de nommer operator+, operator-, etc., les fonctions opératoires :

class fraction {     long num, den;        // numérateur, dénominateur     public :     fraction(long numer, long denom = 1)         { num = numer; den = denom; }		     friend fraction operator+(fraction,  fraction);     friend fraction operator-(fraction, fraction);     friend fraction operator*(fraction, fraction);     friend fraction operator/(fraction, fraction);     };     inline fraction operator+(fraction f1,  fraction f2){     return fraction(f1.num*f2.den + f1.den*f2.num,                     f2.den*f1.den);}inline fraction operator-(fraction f1,  fraction f2){     return fraction(f1.num*f2.den - f1.den*f2.num,                     f2.den*f1.den);}inline fraction operator*(fraction f1,  fraction f2){     return fraction(f1.num*f2.num, f2.den*f1.den);}inline fraction operator/(fraction f1,  fraction f2){     return fraction(f1.num*f2.den, f2.num*f1.den);}

On peut alors écrire :

fraction f = 1 + 2/fraction(5) - fraction(1,3)*8;

La précédence des opérateurs reste la même (voir tableau en annexe), si bien que f vaut 1 +2/5 -((1/3)*8), soit -4/15. Noter qu’on peut écrire 2/fraction(5), ou fraction(2)/5, ou fraction(2)/fraction(5), ou encore fraction(2, 5) (qui cependant a un sens différent car il n’y a pas d’opération exécutée dans ce cas), mais il ne faut pas écrire 2/5 qui donnerait une division entière normale (soit 0 ici).

Il reste possible d’employer le nom complet des opérateurs, comme ceci :

fraction f = operator-(operator+(1, operator/(2,                   fraction(5)), operator*(fraction(1,3), 8));

ce qui donne le même résultat mais est évidemment peu rentable. Cela indique toutefois clairement dans quel ordre les opérations sont exécutées.

Exercice 7.1

Combien de fonctions sont-elles appelées dans l’expression précédente ? Et quelle est la place mémoire occupée au total ?

Voir solution

Les opérateurs redéfinis peuvent aussi être écrits comme des fonctions membres :

class fraction {     // ...     fraction operator+(fraction f)         { return fraction(num*f.den + den*f.num,                            den*f.den); }

Nous verrons en fin de chapitre comment choisir l’une ou l’autre déclaration.

Exercice 7.2

Que se passe-t-il si l’on additionne 1/4 à lui-même ? Obtient-on le même résultat qu’en multipliant par 2 ? Comment régler le problème ?

Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant