2012-05-04 16 views
6

Sto leggendo il C++ Primer, nel capitolo funzionamento sovraccarico, l'autore ha dato un esempio:Quali sono i tipi di ritorno degli operatori in C++?

// member binary operator: left-hand operand bound to implicit this pointer 
Sales_item& Sales_item::operator+=(const Sales_item&); 
// nonmember binary operator: must declare a parameter for each operand 
Sales_item operator+(const Sales_item&, const Sales_item&); 

poi, l'autore ha spiegato:

Questa differenza corrisponde ai tipi di ritorno di questi operatori quando applicato ai tipi aritmetici: l'addizione produce un valore rvalue e l'assegnazione composta restituisce un riferimento all'operando di sinistra.

Non sono abbastanza sicuro di "compound assignment returns a reference to the left-hand operand". Qualcuno può approfondire ciò, e le cose rilevanti, per favore?

+0

Cercare il metodo di concatenamento. In pratica significa 'a = b' restituisce' a' in modo che 'c = a = b' valuti a' c = (a = b) 'o' a = b' quindi a 'c = a' all in 1 statement. – chris

risposta

5

Ciò significa che si può fare qualcosa di simile a

a = 1; 
(a += 1) += 1; 

e il risultato sarà un == 3. Questo perché la maggior parte dei call sinistra a + = modifica a e poi restituisce un riferimento esso. Quindi il successivo + = opera sul riferimento a a e aggiunge di nuovo un numero.

D'altra parte, l'operatore normale + restituisce una copia del risultato, non un riferimento a uno degli argomenti. Questo significa che un'espressione come a + a = 3; è illegale.

+1

"' a + = 1 + = 1; '". [Ne sei sicuro?] (Http://ideone.com/wK93x) –

+0

@ Robᵩ: Ne è sicuramente sicuro. Ma ciò non significa che sia corretto. -1 per risposta errata. – Nawaz

+1

@Nawaz: Trovo il downvote un po 'duro, poiché è risolto con [solo una coppia di parentesi] (http://ideone.com/hdhf1).L'essenza dell'assegnazione composta è stata catturata nella risposta, quindi fallire Davis perché inciampato su un semplice problema (artefatto della lavagna) sembra un po 'difficile. –

2
a = a + b; 

dista inoltre

a += b; 

che equivale a

a.operator+= (b) 

operatore + = sostiene assegnazione composta:

(a += b) += c; 

equivale a

a.operator+= (b).operator+= (c); 

L'ultima riga non sarebbe possibile se è stato restituito un valore anziché un valore di rvalore.

Si consideri il seguente:

c = a + b; 

è anche

c = a.operator+ (b); 

scrittura

a.operator+ (b) = c; 

ha alcun effetto perché il valore di un non viene modificato.

Problemi correlati