2015-04-29 17 views
5
class compl{ 
    float re,im; 

public: 
    compl(float r, float i) 
     {re=r; im=i;} 
    compl& operator++() 
     {++re; return*this;} //(1) 
    compl operator++(int k){ 
     compl z=*this; re++; im+=k; return z;} //(2) 
    friend compl& operator--(compl& z) 
     {--z.re; return z;} 
    friend compl operator--(compl& z,int k) 
     {compl x=z; z.re--; z.im-=k; return x;} 
}; 

(1) Perché dobbiamo restituire l'oggetto corrente come riferimento? Come ho capito, il riferimento è solo un secondo nome per qualcosa.operatori prefissi e postfissi C++

(2) Perché dobbiamo salvare l'oggetto corrente in z, quindi modificare l'oggetto e restituire la z invariata? In questo modo, restituiremo il valore che non è aumentato. È a causa del modo in cui l'operatore postfissa funziona (restituisce il vecchio valore e quindi lo aumenta)

+2

1. concatenamento operatore 2. * post * incremento – crashmstr

+0

Vorrei chiedere perché hai reso gli operatori '' postfissa '? Sono candidati perfetti per le funzioni dei membri. – vsoftco

+0

È un esempio tratto dal libro. È meglio scriverli come funzioni membro perché cambiano il valore dei parametri? –

risposta

2

(1) Non è necessario, ma è idiomatico perché consente di concatenare operatori o chiamate.

(2) Sì, postfix dovrebbe restituire il valore precedente.

-2

(1) perché vogliamo ++ per restituire un valore troppo, come in

a = b++; 

e costa meno di restituire una copia.

(2) Sì, è il modo in cui l'operatore postfissa funziona. Questo spiega il motivo per cui in genere si consiglia di scrivere un ciclo con iteratori utilizzando il prefisso Incremento

for(iterator it = ..... ; it != .... , ++it) { ...} 

invece di postfix Incremento: evita la costruzione di una copia temporanea.

+0

(1) non è corretto, OP stava chiedendo perché prefisso 'operator ++' deve restituire un riferimento. – vsoftco

+0

1) è necessario restituire un valore per poterlo utilizzare in un compito. Che lascia solo due possibilità - dal valore - tramite il riferimento 2) il ritorno del valore costa di più - e inoltre non funziona se l'incremento viene trasmesso come parametro a una funzione (per riferimento). –

+0

Accetto, ma la tua spiegazione di (1) non è corretta. Innanzitutto, hai un postfix lì. In secondo luogo, 'a = ++ b' farà ancora una copia, anche se' ++ b' restituisce un riferimento (a meno che, ovviamente, 'a' sia un riferimento). La situazione in cui è effettivamente utile è in compiti come '++ b = something'. – vsoftco

0

1- L'overload dell'operatore deve essere restituito per riferimento, ma se non è necessario un alias per la variabile, è possibile aggiungere una funzione chiamata next o simile con la stessa struttura.

2- Sì, poiché è necessario restituire il valore corrente, quindi incrementare la variabile.