2012-05-04 15 views
6

Ich bin der C++ Primer, in dem überlasteten Betrieb Kapitel lesen, der Autor ein Beispiel gab:Was sind Rückgabetypen von Operatoren in C++?

// member binary operator: left-hand operand bound to implicit this pointer 
Sales_item& Sales_item::operator+=(const Sales_item&); 
// nonmember binary operator: must declare a parameter for each operand 
Sales_item operator+(const Sales_item&, const Sales_item&); 

dann, erklärt der Autor:

Diese Differenz die Rückgabetypen dieser Operatoren übereinstimmt, wenn auf arithmetische Typen angewendet: Addition ergibt einen rvalue und eine zusammengesetzte Zuweisung gibt einen Verweis auf den linken Operanden zurück.

Ich bin nicht ganz sicher über "compound assignment returns a reference to the left-hand operand". Kann jemand bitte etwas dazu sagen und relevante Dinge?

+0

Suchmethode verketten. Es bedeutet im Wesentlichen, dass a = b "a" zurückgibt, so dass "c = a = b" zu "c = (a = b)" oder "a = b" und dann zu "c = a" in 1 Aussage führt. – chris

Antwort

5

Es bedeutet, dass Sie Dies ist 3. etwas wie die folgenden

a = 1; 
(a += 1) += 1; 

und das Ergebnis wird ein == tun kann, weil die am weitesten links stehende Aufruf + = a modifiziert und kehrt dann einen Verweis auf es. Dann arbeitet das nächste + = auf dem Verweis auf a und fügt erneut eine Nummer hinzu.

Auf der anderen Seite gibt der Normal + -Operator eine Kopie des Ergebnisses, kein Verweis auf eines der Argumente. Dies bedeutet also, dass ein Ausdruck wie a + a = 3; illegal ist.

+1

"a + = 1 + = 1;' ". [Bist du dir sicher?] (Http://ideone.com/wK93x) –

+0

@ Robo: Er ist sich sicher darüber. Aber das bedeutet nicht, dass er richtig ist. -1 für falsche Antwort. – Nawaz

+1

@Nawaz: Ich finde das Downvote ein wenig hart, da es mit [nur ein paar Klammern] gelöst ist (http://ideone.com/hdhf1).Die Essenz der zusammengesetzten Zuweisung wurde in der Antwort festgehalten, so dass Davis versagt, weil er über ein einfaches Problem (Artefakt des Whiteboards) stolperte, scheint ein bisschen schwer. –

2
a = a + b; 

auch

a += b; 

ist, die an

entspricht
a.operator+= (b) 

operator + = Verbindung Zuordnung unterstützt:

(a += b) += c; 

entspricht

a.operator+= (b).operator+= (c); 

Die letzte Zeile wäre nicht möglich, wenn anstelle eines rvalue ein Wert zurückgegeben würde.

Beachten Sie Folgendes:

c = a + b; 

ist auch

c = a.operator+ (b); 

Schreiben

a.operator+ (b) = c; 

hat keine Wirkung, da der Wert von a wird nicht verändert.