2014-09-01 6 views
5

Perché è necessario restituire un costruttore nel sovraccarico dell'operatore?Perché è necessario restituire un costruttore nell'overloading dell'operatore?

Ecco un esempio:

Complex Complex::operator*(const Complex &operand2) const 
{ 
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary); 
    double Imaginary = (real * operand2.imaginary)+(imaginary * operand2.real); 

    return Complex (Real, Imaginary); 
} 

Sembra di tornare un costruttore per l'oggetto e non l'oggetto stesso? Cosa sta tornando lì?

Questo sembra rendere più senso:

Complex Complex::operator*(const Complex &operand2) const 
{ 
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary); 
    double Imaginary = (real * operand2.imaginary)+(imaginary * operand2.real); 

    Complex somenumber (Real, Imaginary); 

    return somenumber; 
} 
+7

'Complex (...)' è la costruzione di un'istanza * * di 'Complex'. Il costruttore viene utilizzato per inizializzare un oggetto di quel tipo, in questo caso, un temporaneo. – 0x499602D2

+3

"ritorno di un costruttore" ??? Cosa diavolo ti ha fatto concludere che sta "restituendo un costruttore"? Nei costruttori di linguaggio C++ hanno nomi come 'Complesso :: Complesso'. Nota: due parti identiche separate da '::'. Quello sarebbe un nome costruttore. Ora, dove vedi qualcosa che potrebbe sembrare un costruttore nel codice che hai postato? – AnT

+0

Perché non 'return {Real, Imaginary};'? –

risposta

10

In C++ sintassi: (. Pseudonimo un oggetto temporaneo) typeName (argomenti) mezzi per creare un oggetto senza nome di tipo typeName . Gli argomenti vengono passati al costruttore di quell'oggetto (o usati come inizializzatori per i tipi primitivi).

è molto simile in senso al tuo secondo esempio:

Complex somenumber(Real, Imaginary); 
return somenumber; 

con l'unica differenza che l'oggetto ha un nome.

Ci sono alcune piccole differenze tra le due versioni relative alla copia o lo spostamento dell'oggetto alla funzione chiamante. More info here

Tranne quando si tratta di part of a function declaration

+0

Matt, ho modificato il secondo esempio. Sì, non aveva molto senso poiché l'operatore() non era sovraccarico in Complex. – Overtaker

+0

@Overtaker OK, aggiornato –

+0

Per quanto riguarda la funzione di copia/spostamento del costruttore che hai menzionato, è meglio usare la prima versione e restituire un oggetto temporaneo senza nome? – Overtaker