2016-04-12 5 views
6

Es gibt viele Codes für Erklärungen im Internet (auch speziell hier auf Stackoverflow), die *this zurückgeben.Warum geben einige Klassenmethoden "* this" zurück (Objektreferenz von self)?

Zum Beispiel von Post Copy constructor and = operator overload in C++: is a common function possible?:

MyClass& MyClass::operator=(const MyClass& other) 
{ 
    MyClass tmp(other); 
    swap(tmp); 
    return *this; 
} 

Wenn ich schreibe Swap als:

void MyClass::swap(MyClass &tmp) 
{ 
    // some code modifying *this i.e. copying some array of tmp into array of *this 
} 

Ist das nicht genug Einstellung Rückgabewert von operator =-void und vermeiden *this Rückkehr?

+0

Wie denkst du, dass Verkettungsaufgaben wie 'a = b = c' funktionieren? –

+2

Das "normale" Verhalten von 'operator =' ist, dass der Verweis auf das Ergebnis der Operation zurückgegeben wird. Sie können es als void definieren, aber es verhält sich anders als alle Benutzererwartungen. Sie können einfach nicht etwas wie '(x = y) ++' oder irgendeine andere Auswertung schreiben, die den Ergebniswert verwendet. Es ist wichtig, dass Sie den Verweis auf das Objekt und nicht nur den Wert zurückgeben. Wenn Sie nur den Wert zurückgeben, wird der obige Begriff kompiliert, aber das Ergebnis ist falsch! – Klaus

+0

Dies wird [Method Chaining] (https://en.wikipedia.org/wiki/Method_chaining#C.2B.2B) genannt. Related: [Was bedeutet "return * this" in C++?] (Http://stackoverflow.com/q/18162522/514235). – iammilind

Antwort

8

Dieses Idiom existiert Verkettung von Funktion zu aktivieren ruft:

int a, b, c; 
a = b = c = 0; 

Dieses gut für int s arbeitet, so dass es keinen Sinn macht es nicht für benutzerdefinierte Typen arbeiten :)

Ebenso für Strom Betreiber:

std::cout << "Hello, " << name << std::endl; 

die gleiche wie

0 funktioniert

Aufgrund der idiom return *this ist es möglich, wie das erste Beispiel zu verketten.

7

Einer der Gründe, warum *this zurückgegeben wird, um Zuweisungsketten wie a = b = c; zuzulassen, was b = c; a = b; entspricht. Im Allgemeinen könnte das Ergebnis der Zuweisung überall verwendet werden, z. beim Aufruf von Funktionen (f(a = b)) oder in Ausdrücken (a = (b = c * 5) * 10). Obwohl es in den meisten Fällen Code nur komplizierter macht.

+1

Auch in 'if's;)' if (a = 5) ... '. Klassischer Fehler aufgrund dieser Funktion. –

+0

Das macht Sinn, gut, danke – scarface

0

Sie geben *this zurück, wenn es ein starkes Gefühl gibt, dass Sie noch die gleiche Aktion auf dem Objekt aufrufen werden.

zum Beispiel std::basic_string::append selbst zurück, weil es ein starkes Gefühl ist, dass Sie noch eine andere Zeichenfolge anhängen wollen

str.append("I have ").append(std::to_string(myMoney)).append(" dollars");

das gleiche gilt für die operator =

myObj1 = myObj2 = myObj3

swap geht hat nicht diesen starken Sinn. funktioniert der Ausdruck obj.swap(other).swap(rhs) häufig?