62 votes

La surcharge de '==' permet-elle d'obtenir '!=' ?

Si je surcharge manuellement le == pour une structure, est-ce que j'obtiens le != gratuit (vraisemblablement défini comme étant l'opposé booléen), ou dois-je le surcharger manuellement (même si c'est pour juste return !(this == rhs) ?

La question n'est pas de savoir si je peux ou non surcharger les deux opérateurs, mais si je dois surcharger l'inégalité si j'ai déjà surchargé l'opérateur d'égalité. Quoi qu'il en soit, de bonnes réponses ont été données.

76voto

K-ballo Points 44794

Surcharge de travail operator == ne vous donne pas operator != . Vous devez le faire manuellement et la méthode canonique consiste à l'implémenter en termes de operator == dans le cas de !(left == right) .

La sémantique des opérateurs n'est pas dictée par la norme. Vous pourriez très bien surcharger operator == pour signifier l'égalité mais la surcharge operator != à quelque chose de différent comme l'addition ou même l'égalité à nouveau (non pas que ce soit une bonne pratique, en fait il faut la décourager. Dans le doute, faites comme les ints...) . [Voir (1) ci-dessous]

En passant, Boost.Operators peut vous aider à fournir des implémentations canoniques pour les opérateurs. Il existe également std::rel_ops avec une mise en œuvre canonique pour operator != .

(1) Pour en savoir plus, lire Trois règles de base de la surcharge des opérateurs en C++.

17voto

Alok Save Points 115848

Non, rien n'est gratuit. Vous payez pour ce que vous utilisez en C++ (dans le cas de la surcharge d'opérateurs).
Vous ne recevez que l'Opérateur que vous surchargez, rien de plus.

De plus, c'est une bonne pratique que si vous surchargez == alors vous devez surcharger != car les utilisateurs de votre classe s'attendront à ce qu'elle soit disponible.

Surcharge de l'opérateur La FAQ C++ devrait être une bonne lecture.


Répondre à la question actualisée :

La question n'est pas de savoir si je peux ou non surcharger les deux opérateurs, mais si je dois surcharger l'inégalité si j'ai déjà surchargé l'opérateur d'égalité.

NON.
Il n'est pas nécessaire que vous Must surcharge != Si vous avez besoin de surcharger == . Cependant, il est bon que vous Devrait opérateurs de surcharge connexe l'un à l'autre.

Pourquoi est-ce une bonne pratique ?
Pensez-y du point de vue de l'utilisateur de votre classe. Si l'utilisateur de votre classe peut utiliser == (critères d'égalité) pour comparer les objets de votre classe, ils s'attendront naturellement à pouvoir utiliser les critères suivants != (critères de non-égalité) également, cela vient du fait que ces deux opérateurs sont étroitement liés et supportés pour tous les tyes intégrés.

Que se passe-t-il si vous ne tenez pas compte de la should et ne pas surcharger != quand vous surchargez == ?
Si les utilisateurs de votre classe utilisent != ils obtiendront une erreur de compilation.
Ils fronceraient un peu les sourcils de ne pas avoir été fournis avec != lorsqu'ils sont dotés de == et ils devront réaligner leur logique pour utiliser == au lieu de la != .

Vous pouvez donc vous en accommoder, mais attendez-vous à recevoir quelques froncements de sourcils et des plaintes pour manque de convivialité et absence d'interface conviviale.

9voto

scrappedcola Points 6199

Vous devez surcharger chaque opérateur. != et == ne sont pas liés.

1voto

Rok Kralj Points 11593

Ce n'est pas le cas, et heureusement, c'est ainsi. Par exemple, vous pouvez vouloir une structure où a!=b et a==a sont tous deux vrais. L'inverse n'est pas nécessaire, il peut s'agir de tout ce que vous voulez.

Cela stimule la créativité :)

Par exemple, si vous ne connaissez pas le résultat d'une comparaison, ou s'il est généralement inconnu, il serait raisonnable que a==b et a!=b renvoient la même chose.

Exemple : http://en.wikipedia.org/wiki/Three-valued_logic

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X