2011-09-09 9 views

risposta

10

Non è "sbagliato", ma sorprendente. Un compito valuta l'oggetto di destinazione. Questo è ciò che il significato incorporato è. Se lo definisci diverso per la tua classe, le persone potrebbero confondersi.

Esempio:

int c; 
while((c = getchar()) != EOF) { 
    // ... 
} 

L'assegnazione di c restituito c stessa e paragonato a EOF seguito. Gli utenti si aspettano che la tua classe item si comporti in modo simile.

5

La firma con vuoto non consentirebbe assegnazioni concatenati:

a = b = c; 

(. Guardate risposta Johannes' per un altro esempio di un modello di utilizzo in base incarico restituendo il valore assegnato)

Ecco perché l'utilizzo di tali firme è scoraggiato. Tuttavia, se non mi sbaglio, in realtà è possibile che utilizzi tale firma.

+0

e fondamentalmente questo è ciò che i tipi incorporati fanno –

2

È perfettamente legale. Ma quando si dichiara operator= così, si sarà in grado di fare "catena di assegnazione":

item a(X); 
item b; 
item c; 
c = b = a; 

riferimento consente la modifica valore restituito. Dal operator= viene valutato da destra a sinistra, l'utilizzo che ti ho mostrato sta funzionando.

EDIT Inoltre, come già menzionato, il valore restituito viene spesso utilizzato in espressioni come while (a = cin.get()) != 'q'). Ma puoi anche dichiarare l'operatore come A operator=(const A&) (restituisce copia) o const A& operator(const A&) (restituisce riferimento const). Il mio punto è: questo operatore può restituire qualsiasi cosa, ma il modo idiomatico è di restituire un riferimento non const a se stesso.

+1

Non solo, dichiarando 'operator =' come return 'void' non sarà possibile utilizzare il risultato del compito in qualsiasi espressione. –

Problemi correlati