2013-03-08 10 views
14

Ich beginne gerade C++. Ich bin ein wenig verwirrt über den Rückgabetyp des Zuweisungs- und Dereferenzierungsoperators. Ich folge dem Buch C++ Primer. Bei verschiedenen Gelegenheiten sagt der Autor, dass der Rückgabetyp des Zuweisungsoperators sich auf den Typ des linken Operanden bezieht, aber später sagt er, dass der Rückgabetyp der Typ des linken Operanden ist. Ich habe C++ 11 Standardsek verwiesen. 5.17, wobei der Rückgabetyp als "lvalue, der sich auf den linken Operanden bezieht" beschrieben wird.Was ist der Rückgabetyp des Zuweisungsoperators?

In ähnlicher Weise kann ich nicht herausfinden, ob Dereferenz das Objekt oder die Referenz auf das Objekt zurückgibt.

Sind diese Aussagen äquivalent? Wenn ja, wie? Jede Erklärung wäre willkommen.

+1

Plz jeder Notiz nehmen. Danke für alle Antworten, aber ich wollte nicht nach Überlastung des Bedieners fragen. Ich bin noch nicht da, ich habe nur nach der in der Sprache gebauten Zuweisungsoperation gefragt. – rahul1210

Antwort

18

Der Standard definiert korrekt den Rückgabetyp eines Zuweisungsoperators. Tatsächlich hängt die Zuweisungsoperation selbst nicht vom Rückgabewert ab - deshalb ist der Rückgabetyp nicht einfach zu verstehen.

Der Rückgabetyp ist wichtig für Verkettungsoperationen. Betrachten Sie die folgende Konstruktion: a = b = c;. Dies sollte gleich a = (b = c) sein, d. H. c sollte in b und b in a eingeteilt werden. Schreiben Sie dies als a.operator=(b.operator=(c)) um. Damit die Zuweisung in a korrekt funktioniert, muss der Rückgabetyp von b.operator=(c) Verweis auf das innere Zuweisungsergebnis sein (es wird auch mit Kopie funktionieren, aber das ist nur ein unnötiger Overhead).

Der Dereferenzierungsoperator-Rückgabetyp hängt von Ihrer inneren Logik ab, definieren Sie ihn auf die Weise, die Ihren Anforderungen entspricht.

+1

"Der Standard definiert korrekt den Rückgabetyp eines Zuweisungsoperators" - wie? –

+7

@LuchianGrigore als OP hat zitiert: * C++ 11 Standard sek. 5.17, wo der Rückgabetyp beschrieben wird als "lvalue bezieht sich auf den linken Operanden". * – SomeWittyUsername

+7

Dieser letzte Kommentar ist bereits nützlicher als die ganze Antwort. –

5

können Sie beide sein, etwas, aber in der Regeloperator = kehrt das aktuelle Objekt Bezug genommen wird, dh

A& A::operator = (...) 
{ 
    return *this; 
} 

Und ja, „Bezug auf die Art der linken Operand“ und „L-Wert mit Bezug auf die linke Hand Operand "dasselbe bedeuten.

Der Dereferenzierungsoperator kann grundsätzlich jeden Rückgabetyp haben. Es hängt hauptsächlich von der Logik des Programms ab, weil Sie den Operator überlasten, der auf ein Objekt und nicht auf einen Zeiger auf das Objekt angewendet wird. Üblicherweise wird diese für Smart-Pointer verwendet, oder Iteratoren und senden Sie das Objekt, das sie umschlingen:

+0

Können Sie bitte den "lvalue, der sich auf den linken Operanden bezieht" erweitern, was dasselbe bedeutet wie "Verweis auf den Typ des linken Operanden". Ist Referenz ein Lvalue? – rahul1210

+0

@ user2148032 Ja, eine Referenz ist ein Lvalue. Der linke Operand ist das Objekt selbst (weil "x = y" den linken Operanden "x" hat). –

+0

danke ich denke, ich habe es – rahul1210

1

ich ähnliche Probleme gesehen haben, aber ich denke, es wäre am besten,

X& X::operator=(const X&); 

verwenden Verwenden Dadurch können Sie das Objekt in einer Kettenzuordnung wiederverwenden.