Règles générales de la surcharge d'opérateur
Les règles suivantes limitent comment les opérateurs surchargés sont implémentés.Toutefois, ils ne s'appliquent pas aux opérateurs de nouveau et de suppression , qui sont traités séparément.
Vous ne pouvez pas définir de nouveaux opérateurs, tel que **.
Vous ne pouvez pas modifier la signification des opérateurs appliqué aux types de données prédéfinis.
Les opérateurs surchargés doivent être une fonction non statique de membre de classe ou une fonction globale.Une fonction globale qui a besoin d'accéder aux membres de classe privés ou protégés doit être déclarée comme fonction friend de cette classe.Une fonction globale doit prendre au moins un argument qui est de classe ou de type énuméré ou qui est une référence à une classe ou un type énuméré.Par exemple :
// rules_for_operator_overloading.cpp class Point { public: Point operator<( Point & ); // Declare a member operator // overload. // Declare addition operators. friend Point operator+( Point&, int ); friend Point operator+( int, Point& ); }; int main() { }
L'exemple de code précédent déclare infériorité l'opérateur comme une fonction membre ; toutefois, les opérateurs d'addition sont déclarés en tant que fonctions globales qui ont accès ami.Notez que plusieurs implémentations peut être fournie pour un opérateur donné.Dans le cas de l'opérateur d'addition précédent, les deux implémentations sont fournies pour simplifier le commutativity.Il est tout aussi probable que les opérateurs qui ajoutent Point à Point, int à Point, et ainsi de suite, peuvent être implémentés.
Les opérateurs obéissent à la priorité, l'agrégation, et le nombre d'opérandes défini par leur utilisation classique avec les types intégrés.Par conséquent, il est impossible d'exprimer le concept « additionnent 2 et 3 à un objet de type Point, » le code qui s'attend à ce que 2 sont ajoutés à la position x et 3 à ajouter à y.
Les opérateurs unaires déclarés comme fonctions membres ne prennent pas d'argument ; si déclaré comme des fonctions globales, ils prennent un argument.
les opérateurs binaires déclarés comme fonctions membres prennent un argument ; si déclaré comme des fonctions globales, ils prennent deux arguments.
Si un opérateur peut être utilisé comme unaire ou un opérateur binaire (&, *, +, et -), vous pouvez surcharger chaque utilisation séparément.
Les opérateurs surchargés ne peuvent pas avoir d'arguments par défaut.
Tous les opérateurs surchargés à l'exception de l'assignation (operator=) sont hérités par des classes dérivées.
Le premier argument pour les opérateurs surchargés fonction membre est toujours le type de classe de l'objet pour lequel l'opérateur est appelé (la classe dans lequel l'opérateur est déclaré, ou une classe dérivée de cette classe).aucune conversion n'est fournie pour le premier argument.
Notez que la signification des opérateurs de l'ordinateur peut être modifiée complètement.Cela inclut la signification d'adresse (&), de l'assignation (=), les opérateurs d'appel de fonction.En outre, les identités qui peuvent être comptabilisées au moment pour les types intégrés peuvent être modifiés à l'aide de la surcharge d'opérateur.Par exemple, les quatre instructions suivantes sont généralement équivalentes une fois complètement évaluée :
var = var + 1;
var += 1;
var++;
++var;
Il ne peut pas compter au moment cette identité pour les types de classe qui surchargent des opérateurs.De plus, certaines spécifications implicites dans l'utilisation de ces opérateurs pour les types de base sont décontractées pour les opérateurs surchargés.Par exemple, l'ajout/opérateur d'assignation, +=, requiert que l'opérande de gauche pour être une l-value lorsqu'ils sont appliqués aux types de base ; il n'existe aucune spécification lorsque l'opérateur est surchargé.
[!REMARQUE]
Pour des raisons de sécurité, il est souvent préférable de suivre le modèle des types intégrés en définissant les opérateurs surchargés.Si la sémantique d'un opérateur surchargé diffèrent considérablement de sa signification dans d'autres cas, il peut être plus entraînait alors qu'utiles.