Le changement de type est un opérateur (en fait une noria dopérateurs, puisquil y en a autant que le nombre de types). Pour un type donné, il peut sécrire de deux façons différentes lorsquon lutilise soit sous la forme opératoire (type) x
, soit sous la forme fonctionnelle type(x)
. Dans tous les cas, cest un opérateur unaire, de nom operator type()
(mais pas operator(type)()
qui provoquerait une erreur). La syntaxe est un peu spéciale, en ce sens quaucun type résultat nest à déclarer (cest en fait type
), cest-à-dire quon nécrit pas type operator type()
mais directement operator type()
dans la classe (ce doit être une méthode obligatoirement).
Voici par exemple une définition de changement de type de fraction
vers double
tout à fait naturelle :
class fraction { // ... comme ci-avant operator double() { return num/ double(den); } };
On peut alors écrire :
fraction f(3,17); // donne 3/17double d = double(f); // ou encore d = (double)f;
Notons que la définition dun opérateur inverse, de fraction
vers double
, est plus problématique, car les fractions ne sont pas généralement représentables exactement dans un nombre à virgule flottante. La conversion inverse exige donc une définition dune notion de précision.
Les opérateurs de conversion ne peuvent avoir pour arguments que des classes nouvellement définies, comme on la dit au paragraphe précédent. En conséquence, on ne peut pas créer un opérateur operator fraction(long)
par exemple.
Nous connaissons cependant déjà la solution à ce problème : il suffit décrire un constructeur fraction::fraction(long)
dont leffet sera strictement identique. Cest dailleurs ce que nous avons fait précédemment.
Précédent | Sommaire | Suivant |