welche Operatoren des Vergleichs (< =,>, ==, etc.) tun Sie in der Regel als Ihre Basisoperatoren, die Sie nach der Verwendung der Restvergleichsoperatoren implementieren oder alle möglichen Vergleiche zwischen den Klassen vornehmen können?Was ist die Mindestanzahl an Operatoren, die ich überlasten muss?
Antwort
Sie können alle sechs des Betreibers in Bezug auf ==
implementieren und <
folgende Äquivalenzen mit:
a != b => !(a == b)
a > b => b < a
a >= b => !(a < b)
a <= b => !(b < a)
Sie können das auch nur mit dem Operator
Für Klassen, in denen sie anwendbar sind in der Regel operator<
und operator==
ich implementieren „nativ“ wegen ihrer Bedeutung in Standardalgorithmen und Container.
Ich dann implementieren die anderen vier in Bezug auf diese.
Ein weiterer Ansatz, den ich manchmal prüfen, ist ein „Vergleich“ Funktion implementiert, die 1
, 0
oder -1
im Stil strcmp
und das Gerät alle anderen Betreiber in Bezug auf diese zurückgibt. Ich tue das nur, wenn operator<
und operator==
so aussehen, als müssten sie viel vom gleichen Code teilen, was weniger oft vorkommt, als ich denke.
Ich normalerweise implementieren operator==
für Objekte und auch operator!=
. Viele Objekte haben keine Sortierfolge, daher sind die Vergleichsoperatoren <, < =,>,> = nicht sinnvoll.
Außerdem müssen unter Verwendung von boost::equality_comparable
und boost::less_than_comparable
nur operator==
und operator<
implementiert werden. Diese können in boost/operators.hpp
gefunden werden.
Außerdem habe ich gelernt, dass das Platzieren von Vergleichsoperatoren in Basisklassen oder Interface-Klassen ziemlich kompliziert werden kann, da sie Descendent_A mit Descendent_B vergleichen können, die zwei verschiedene abgeleitete Klassen sind.
Vergleichsoperatoren sollten nach Bedarf in Klassen implementiert werden. Viele Klassen brauchen sie nicht. Achten Sie auch darauf, sie zu implementieren oder in Basisklassen zu definieren, ohne die Auswirkungen der Vererbung zu berücksichtigen.
- 1. Wenn ich die Operatoren + und = überladen habe, muss ich + = überladen?
- 2. Was tun die Operatoren '& =' und '= &'?
- 3. Bestimmung, die wurde überlasten
- 4. Wie kann ich die Operatoren [] überladen?
- 5. Was ist die Mindestanzahl von Parametern, die an eine Funktion übergeben werden, während eine Bibliotheksfunktion für die Matrixaddition erstellt wird
- 6. Was ist der richtige Weg, um die Stream-Operatoren zu überlasten << >> für meine Klasse?
- 7. Was sind die | und^Operatoren verwendet für?
- 8. Ist divmod() schneller als die Operatoren% und //?
- 9. Was sind die "Muss" jQuery-Plugins?
- 10. Der! und die && Operatoren Java
- 11. Ich muss eine ganze Zahl an die 'td: nth' übergeben
- 12. Muss ich die Koordinatenumwandlung durchführen?
- 13. Was mache ich falsch mit bedingten Operatoren?
- 14. Was muss ich tun, um an Scheme zu bezahlen?
- 15. Sollten die Postfix-Operatoren nicht als binäre Operatoren betrachtet werden
- 16. Wie funktioniert die Bedingungserklärung mit bitweisen Operatoren?
- 17. Meine Methode muss weniger Operatoren verwenden
- 18. Was ist die DynamicProxyGenAssembly2-Assembly?
- 19. Muss ich die Erweiterung ninject.mvc noch verwenden?
- 20. Was ist die ⎋ Taste?
- 21. Was ist die JVMID?
- 22. Was ist die "Akzentfarbe"?
- 23. Was ist die MinUptime
- 24. Was ist die Ausnahmebildung?
- 25. Was ist die "Abdeckungsbedingung"?
- 26. Kann ich die von LINQ-to-SQL unterstützten Operatoren erweitern?
- 27. Was ist Assoziativität von Operatoren und warum ist es wichtig?
- 28. Mindestanzahl von Dezimalstellen für die Genauigkeit von std :: ostream festlegen
- 29. Muss ich immer die letzte targetSdkVersion verwenden?
- 30. Was ist die längste Zeichenfolge, die ich haben kann?
Vielleicht möchten Sie einen Blick auf die große FAQ zum Überladen von Operatoren (http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719) werfen, die auch Ihre Frage behandelt. –