2017-05-15 3 views
0

Ich versuche zu verstehen, Betreiber Überladung von Pluszeichen. Ich sehe 2 Prototypen:Operator überladen von Pluszeichen in C++

Box operator+(const Box& b) { ... } 
Box operator+(const Box& left, const Box& right) { ... } 

Welches ist richtig? Wenn der Unterschied nur darin besteht, dass die erste Elementfunktion ist und die zweite Nichtmitglied ist, dann lege ich fest, dass ich beide Möglichkeiten definiere, und dann, welche wird aufgerufen?

Box a, b; 
Box c = a + b; 
+0

Versuchen Sie es. (füllen, füllen) –

+0

_ "lassen Sie uns sagen, ich definiere beide Möglichkeiten" _ Was ist passiert, als Sie es versucht haben? –

+0

@RustyX: Ich sehe nicht wie. –

Antwort

1

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.

+0

Ein weiterer wichtiger Unterschied: Ein Nichtmitglied erlaubt implizite Konvertierungen des linken Operanden in 'Box'; Ein Mitglied nicht. – aschepler