J'ai pour surcharger mon opérateur la possibilité d'utiliser une fonction membre ou une fonction libre, que choisir ?
Par exemple, pour définir un opérateur + dans une classe A, on peut écrire :
Version avec une fonction membre
1 2 3 4
| class A
{
A operator+(A const & second);
}; |
Version avec une fonction libre
1 2 3 4 5 6
|
class A
{
};
A operator+(A const &first, A const &second); |
Quelle est la version préférable ? En général, pour un opérateur binaire, la fonction libre, car elle respecte la symétrie que l'on s'attend à trouver entre les opérandes d'un tel opérateur, alors que la fonction membre considère que l'élément sur lequel elle agit (le this) doit être exactement du type voulu.
En particulier, imaginons que l'on puisse convertir un entier en une variable de type A (par exemple si A possède un constructeur non explicite prenant uniquement un entier en paramètre). Alors, on a le comportement suivant :
Version avec une fonction membre
1 2 3 4
| A a1, a2;
a1 + a2; // Ok
a1 + 42; // Ok
42 + a2; // Ne compile pas |
Version avec une fonction libre
1 2 3 4
| A a1, a2;
a1 + a2; // Ok
a1 + 42; // Ok
42 + a2; // Ok |
Il y a par contre des opérateurs que l'on n'a le droit de surcharger que comme fonction membre : operator=, operator(), operator[] et operator->
Partager