2016-06-09 22 views
0

Ich bin durch das folgende Beispiel verwirrt:Verwirrt über Rückkehr von Referenz

class complex { 
    double re, im; 
public: 
    complex(double r, double i) : re{r}, im{I}() 

    complex& operator+= (const complex&z) { re += z.re; im += z.im; return *this; } 
}; 

Ich verstehe nicht, warum der Rückgabetyp vom operator += durch Referenz, da re und im werden immer aktualisiert. Ich verstehe auch nicht, warum *this enthalten ist.

+0

Ich verstehe nicht, warum Sie denken, dass "re" und "im", die aktualisiert werden, etwas mit dem Rückgabetyp zu tun haben. 'return * this;' gibt es, weil '* this' das Objekt ist, auf das die Funktion eine Referenz zurückliefert. – molbdnilo

Antwort

0

Erstens:

Ihre Betreiber + = nicht richtig erklärt. Es sollte

complex& operator+=(complex const& other){...} 

Zweitens Ihre eigentliche Frage zu beantworten, kehren Sie * das, weil der Operator + = eine Verbindung Zuweisungsoperator ist, die den internen Zustand der Variablen werden zugewiesen ändern. Sie geben also einen Verweis auf die Variable zurück, auf die "this" zeigt.

+0

Der Code wurde direkt aus dem Buch Die C++ Programmiersprache von Bjarne Stroustrup (der Schöpfer von C++) –

+0

nicht richtig? Können wir wissen warum? const T & und T const & sind das gleiche richtig? – Yves

+0

Eine Bearbeitung der Frage hat die Deklaration behoben, seit diese Antwort gepostet wurde. –

1

Es könnte auch void zurückgeben.

Die C++ Konvention ist, dass operator+= einen Verweis auf seinen linken Operanden zurückgibt, so dass Sie einen Ausdruck wie if((x += y) > 10) schreiben können.

+0

Könnten Sie bitte erklären, warum es notwendig ist, eine Referenz für if ((x + = y)> 10 bitte zurück) Sorry, ich bin nur neu für alle –

+0

@MichaelHutton Wenn es 'void' zurückgibt, dann können Sie einfach' + = 'verwenden, um Plus zu machen und den Wert zu aktualisieren.Wenn es' void' zurückgibt, können Sie nichts mehr tun. Wenn es die Referenz von * zurückgibt Sie können den Wert sofort verwenden, zB a + = b = c, oder (a + = b)> c usw. Sie bedeuten a = a + b, a = c und a = a + b; a> c. – Yves

+0

Ahhh, jetzt verstehe ich das! Danke für diese Info –

1

Per Konvention versuchen wir, dass operator für Klasse funktioniert wie für eingebaute.

und

int i = 0; 
(i += 40) += 2; 

gültig ist.

So per Referenz ermöglicht das für Klassen.