2013-03-08 14 views
14

Sto avviando il C++. Sono un po 'confuso riguardo al tipo di ritorno dell'operatore di assegnazione e di dereferimento. Sto seguendo il libro C++ Primer. In varie occasioni, l'autore afferma che il tipo restituito di operatore di assegnazione fa riferimento al tipo di operando sulla mano sinistra, ma in seguito afferma che il tipo restituito è il tipo dell'operando della mano sinistra. Ho citato C++ 11 Standard Sec. 5.17, dove il tipo di ritorno è descritto come "lvalue riferito all'operando della mano sinistra".qual è il tipo di ritorno dell'operatore di assegnazione?

Analogamente, non riesco a capire se la deviazione restituisce l'oggetto puntato o il riferimento all'oggetto.

Queste dichiarazioni sono equivalenti? Se è così, allora come? Qualsiasi spiegazione sarebbe apprezzata.

+1

Plz tutti prendono atto. grazie per tutte le risposte, ma non volevo chiedere informazioni sul sovraccarico dell'operatore. non ci sono ancora, stavo solo chiedendo informazioni sull'assegnazione costruita nella lingua. – rahul1210

risposta

18

Lo standard definisce correttamente il tipo di reso di un operatore di assegnazione. In realtà, l'operazione di assegnazione di per sé non dipende dal valore di ritorno - ecco perché il tipo di reso non è semplice da comprendere.

Il tipo di ritorno è importante per le operazioni di concatenamento. Considerare la seguente costruzione: a = b = c;. Questo valore deve essere uguale a a = (b = c), ad esempio c deve essere assegnato a b e b a a. Riscrivi come a.operator=(b.operator=(c)). Affinché l'assegnazione a a funzioni correttamente, il tipo restituito di b.operator=(c) deve fare riferimento al risultato di assegnazione interno (funzionerà anche con la copia ma si tratta solo di un sovraccarico non necessario).

Il tipo di ritorno dell'operatore di dereferenziazione dipende dalla logica interna dell'utente, la definisce nel modo che soddisfa le proprie esigenze.

+1

"Lo standard definisce correttamente il tipo di ritorno di un operatore di assegnazione" - come? –

+7

@LuchianGrigore come OP ha citato: * C++ 11 Standard Sec. 5.17, dove il tipo di ritorno è descritto come "lvalue che si riferisce all'operando della mano sinistra". * – SomeWittyUsername

+7

Questo ultimo commento è già più utile dell'intera risposta. –

5

Entrambi possono essere qualsiasi cosa, ma solitooperator = restituisce l'oggetto corrente di riferimento, vale a dire

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

E sì, "riferimento al tipo di operando mano sinistra" e "valore assegnabile riferendosi alla mano sinistra operando "significa la stessa cosa

L'operatore di dereferenza può avere praticamente qualsiasi tipo di reso. Dipende principalmente dalla logica del programma, perché stai sovraccaricando l'operatore che si applica a un oggetto, non a un puntatore all'oggetto. Di solito, questo è usato per puntatori intelligenti, o iteratori, e restituire l'oggetto che avvolgono:

+0

Potete per favore espandere il "lvalue riferito all'operando della mano sinistra" che significa "riferimento al tipo di operando della mano sinistra". Il riferimento è un lvalue? – rahul1210

+0

@ user2148032 sì, un riferimento è un lvalue. L'operando di sinistra è l'oggetto stesso (poiché 'x = y' ha l'operando di sinistra' x'). –

+0

grazie penso di averlo capito – rahul1210

1

ho visto problemi simili, ma credo che sarebbe stato meglio usare

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

Utilizzando questo, sarai in grado di riutilizzare l'oggetto in un'assegnazione di catena.