Opérateurs redéfinissables et hypothèses

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 n’est pas possible de changer l’ « arité » d’un opérateur, c’est-à-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 d’un opérateur que l’on souhaite définir n’est pas clairement imposé par le contexte, il convient de réfléchir soigneusement à celui que l’on choisira, notamment en fonction de la précédence souhaitée. Ainsi, on pourrait imaginer, sur une classe numérique comme fraction, d’utiliser l’opérateur ^ pour symboliser l’exponentiation ( « x à la puissance y » ), comme c’est 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 n’est pas très naturel. On préférera dans ce cas définir une méthode, nommée par exemple pow (abréviation de l’anglais 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 n’y a aucune restriction pratique sur la redéfinition d’opérateurs. En particulier, le compilateur ne fait aucune hypothèse fonctionnelle à leur sujet ; il ne suppose jamais qu’ils sont symétriques par exemple. Si dans un contexte naturel, a + b est égal à b + a, il n’en 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 n’est pas commutative.

Rappelons qu’en vertu des règles de recouvrement de fonctions, il peut exister plusieurs versions différentes d’un même opérateur si elles s’appliquent à des opérandes différents. Par exemple, on pourrait définir un opérateur operator+(fraction, long) si l’on connaissait un moyen nettement plus rapide d’additionner une fraction et un entier que deux fractions (ce qui n’est guère le cas). Dans ce cas, il faudrait aussi définir operator+(long, fraction) afin que le gain soit obtenu quel que soit l’ordre d’écriture des termes.

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