2016-04-12 14 views
6

Ci sono un sacco di codici per la spiegazione su internet (anche specificamente qui, su StackOverflow) che restituiscono *this.Perché alcuni metodi di classe restituiscono "* this" (riferimento all'oggetto di self)?

Per esempio dal 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; 
} 

Quando scrivo di swap come:

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

non è sufficiente valore di ritorno di impostazione di operator =-void ed evitare il ritorno *this?

+0

Come pensi che i compiti concatenati come 'a = b = c' funzionino? –

+2

il comportamento "normale" di 'operator =' è quello di restituire il riferimento al risultato dell'operazione. Puoi definirlo come vuoto ma si comporta in modo diverso da tutte le aspettative degli utenti. Semplicemente non è possibile scrivere qualcosa come '(x = y) ++' o qualsiasi altra valutazione che utilizza il valore del risultato. È importante che tu restituisca il riferimento all'oggetto non solo il valore. Se restituisci solo il valore, il termine sopra verrà compilato ma il risultato è sbagliato! – Klaus

+0

Questo è chiamato [Metodo di concatenazione] (https://en.wikipedia.org/wiki/Method_chaining#C.2B.2B). Corretto: [Cosa significa "restituisce * questo" in C++?] (Http://stackoverflow.com/q/18162522/514235). – iammilind

risposta

8

Questo linguaggio esiste per consentire il concatenamento di chiamate di funzione:

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

Questo funziona bene per int s, quindi non c'è alcun punto nel farlo non funziona per tipi definiti dall'utente :)

Analogamente per il flusso operatori:

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

funziona come quello di

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

A causa dell'idioma return *this, è possibile eseguire il concatenamento come nel primo esempio.

7

Una delle ragioni per cui viene restituito *this per consentire catene di assegnazione come a = b = c; che è equivalente a b = c; a = b;. In generale, il risultato dell'assegnazione potrebbe essere utilizzato ovunque, ad es. quando si richiamano funzioni (f(a = b)) o in espressioni (a = (b = c * 5) * 10). Anche se, nella maggior parte dei casi, rende il codice più complicato.

+1

Anche in 'if's;)' if (a = 5) ... '. Bug classico a causa di questa caratteristica. –

+0

Questo ha senso, bene, grazie – scarface

0

si restituisce *this quando si ha la netta sensazione che si invochino la stessa azione sull'oggetto.

per esempio, std::basic_string::append stessa tornare perché c'è un forte senso che si dovranno aggiungere ancora un'altra stringa

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

lo stesso vale per la operator =

myObj1 = myObj2 = myObj3

swap non ha questo forte senso. l'espressione obj.swap(other).swap(rhs) sembra comune?

Problemi correlati