Tous les opérateurs sont redéfinissables, sauf ?:
(qui est le seul opérateur ternaire de C++), sizeof
, et ceux directement liés aux classes, à savoir le point (.
), ainsi que les pointeurs sur membres (.*
) et les opérateurs de résolution de portée (::
et ::*
).
On ne peut pas créer de nouveaux opérateurs ayant un nom ne figurant pas dans la liste donnée en annexe, comme par exemple **
ou :=
. De plus, il nest pas possible de changer l « arité » dun opérateur, cest-à-dire son caractère binaire ou unaire. Enfin on ne peut pas modifier leur précédence, qui reste toujours celle indiquée dans le tableau en annexe.
Il en résulte que, lorsque le nom dun opérateur que lon souhaite définir nest pas clairement imposé par le contexte, il convient de réfléchir soigneusement à celui que lon choisira, notamment en fonction de la précédence souhaitée. Ainsi, on pourrait imaginer, sur une classe numérique comme fraction
, dutiliser lopérateur ^
pour symboliser lexponentiation ( « x
à la puissance y
» ), comme cest le cas dans certains langages de programmation. Ce choix est bien entendu possible, mais pas très heureux, car la précédence de cet opérateur est assez faible. De ce fait, une expression comme a + b^c
sera interprétée comme (a+b)^c
, ce qui nest pas très naturel. On préférera dans ce cas définir une méthode, nommée par exemple pow
(abréviation de langlais power
, puissance), et écrire a + b.pow(c)
qui ne prête pas à erreur.
En dehors des deux règles énoncées ci-dessus, il ny a aucune restriction pratique sur la redéfinition dopérateurs. En particulier, le compilateur ne fait aucune hypothèse fonctionnelle à leur sujet ; il ne suppose jamais quils sont symétriques par exemple. Si dans un contexte naturel, a + b
est égal à b + a
, il nen est pas forcément ainsi pour un opérateur redéfini, et le compilateur ne le supposera donc pas : la première expression correspond à operator+(a, b)
, la seconde à operator+(b, a)
. Cela peut sembler anecdotique, mais est très important en pratique, pour des objets comme les matrices, dont la multiplication nest pas commutative.
Rappelons quen vertu des règles de recouvrement de fonctions, il peut exister plusieurs versions différentes dun même opérateur si elles sappliquent à des opérandes différents. Par exemple, on pourrait définir un opérateur operator+(fraction, long)
si lon connaissait un moyen nettement plus rapide dadditionner une fraction et un entier que deux fractions (ce qui nest guère le cas). Dans ce cas, il faudrait aussi définir operator+(long, fraction)
afin que le gain soit obtenu quel que soit lordre décriture des termes.
Précédent | Sommaire | Suivant |