Warum verwenden wir Referenz Rückkehr in Zuweisungsoperator überladen und nicht bei plus-minus-ops?
Wie ich gelesen habe in Büchern und im web, in C++ können wir die überlastung der "plus" oder "minus" - Operatoren mit diesen Prototypen (als member-Funktionen einer class Money
):
const Money operator +(const Money& m2) const;
const Money operator -(const Money& m2) const;
und für den Zuweisungsoperator mit:
const Money& operator =(const Money& m2);
Warum verwenden Sie einen Verweis auf ein Geld-Objekt als return-Wert in der Zuweisungsoperator überladen und nicht in die plus-und minus-Operatoren?
- Wenn Sie zurückgegeben wird eine Referenz in einem
+
oder-
binäre operation, was sollte er finden? Es macht keinen Sinn für die Rückgabe einer Referenz. Der Betrieb muss ein neues Objekt erstellen. - Wollen Sie nicht in der Lage sein, um code a + b = c;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rückgabe einer Referenz-Zuweisung ermöglicht die Verkettung:
(Dies würde auch arbeiten (in den meisten Fällen), wenn die Betreiber zurückgegeben eine Kopie des neuen Wertes, aber das ist in der Regel weniger effizient.)
Können wir nicht wieder einen Verweis von arithmetischen Operationen, da Sie zu einem neuen Wert. Die einzige (sinnvolle) Weg, um wieder einen neuen Wert zurückgeben, es von Wert.
Rückkehr einen Konstanten Wert, wie dein Beispiel funktioniert, verhindert das verschieben der Semantik, so tun Sie das nicht.
Weil
operator+
undoperator-
don ' T act auf diese Objekt, aber wieder ein neues Objekt, das ist die addition (oder Subtraktion) dieses Objekt von einem anderen.operator=
ist anders, weil es eigentlich zuweisen etwas zu diesem Objekt.operator+=
undoperator-=
handeln würde, die auf dieses Objekt, und sind einen genaueren analog zuoperator=
.Überlegen, was Sie Fragen. Sie möchten ein Ausdruck,
a + b
, für die Rückgabe einer Referenz auf ein a oder b haben, würden die Ergebnisse des Ausdrucks. So Bearbeiten Sie eine von a oder b auf die Summe von a und b ist. So würden Sie wollen, um neu zu definieren die Semantik des operators (+) der gleiche sein wie der operator (+=). Und wie @manuell gesagt, Sie würde damit(a + b) = c
. Die Semantik, die Sie vorschlagen, sind bereits angeboten += und -=.Ich denke, dass seine feine, wenn Sie die return-by-value in überladenen Zuweisungsoperator , das ist wegen der Assoziativität der Zuweisungsoperator. Bedenken Sie:
int a = b =c = 3 ;
hier Assoziativität der Operatoren ist wie folgt:
(a=(b=(c=3)))
aber betrachten Sie die iostream-Betrieb
cout << x << y << z ;
hier Assoziativität der Operatoren ist wie folgt:
(((cout << x )<< y) << z) ;
können Sie sehen, dass x wird zuerst ausgedruckt werden , so dass, wenn Sie zurückkehren, indem Sie den Wert zu einer überlastung des << operator return-Wert wird nicht "lvalue" , während der Rückkehr von refrence ist ein lvalue , so Kaskadierung << operator können Sie erreichen.
einen Punkt mehr , copy-Konstruktor wird aufgerufen, wenn Sie die Rückgabe per Wert. ( das ist nicht der Fall mit der Rückkehr von refrence)
Den link unten gezeigt hat bessere Erklärung denke ich
Rückgabewert von operator-überladung in C++