Was "richtig" oder "besser" ist, hängt von Ihrer Anwendung ab. Die Memberversion ermöglicht den Zugriff auf alle privaten Attribute und Methoden von Box
, die Nichtmitgliedsversion nicht, es sei denn, sie wird als friend
von Box
deklariert. Aber ein Nicht-Mitglied kann templatiert werden und für eine breite Palette von Arten angewendet werden.
Mitglieder werden nicht vom Compiler gegenüber Nicht-Mitgliedern im Allgemeinen bevorzugt, und umgekehrt. Stattdessen werden C++ overload resolution rules angewendet, um das eine oder das andere auszuwählen.
Box Box::operator+(const Box& b)
wird behandelt, als ob es zwei Argumente: Box&
, die auf das Objekt verwendet, bezieht sich die Elementfunktion (*this
) zu rufen, und const Box& b
.
In Ihrem Beispiel sind sowohl a
als auch b
nicht const.
Um Box Box::operator+(const Box& b)
aufrufen zu können, muss b
in eine const-Referenz konvertiert werden.
Um Box operator+(const Box& left, const Box& right)
aufzurufen, müssen sowohl a
als auch b
in const-Referenzen konvertiert werden.
So wird der Elementoperator ausgewählt, weil es besser passt (erfordert weniger Konvertierungen).
Hätte Ihr Mitglied operator+
wurde const
deklariert, hätten Sie einen Compilerfehler erhalten, weil der Aufruf mehrdeutig werden würde.
Versuchen Sie es. (füllen, füllen) –
_ "lassen Sie uns sagen, ich definiere beide Möglichkeiten" _ Was ist passiert, als Sie es versucht haben? –
@RustyX: Ich sehe nicht wie. –