2013-06-16 3 views
7
class Foo 
    { 


    }; 

    Foo f; 
    Foo g = f; // (*) 

La mia domanda è, come viene chiamato nella riga contrassegnata da (*)? È l'operatore di copia predefinito ctr o '='?Copia costruttore o = operatore?

+0

Basta ricordare che "default copy ctr" è un termine improprio in questo caso. In C++ il termine "costruttore di defualt" ha un significato speciale, strettamente definito, che non ha nulla a che fare con il tuo costruttore di copie. Ciò che viene chiamato in questo caso è "* costruttore di copie * fornito dal compilatore" o "costruttore di copie implicito *" o qualcosa del genere. Ma quel costruttore di copie non è certamente "costruttore di default *". – AnT

risposta

8

La mia domanda è, come viene chiamato nella riga contrassegnata da (*)? È l'operatore predefinito di copia ctr o '='?

Il costruttore di copia verrà chiamato.

Anche se il segno = viene utilizzato, questo è un caso di inizializzazione, dove l'oggetto sul lato sinistro è costruito fornendo l'espressione sul lato destro come argomento suo costruttore.

In particolare, questa forma di inizializzazione è denominata inizializzazione copia. Si noti che quando il tipo dell'espressione inizializzatore è lo stesso del tipo di oggetto classe inizializzata (Foo, in questo caso), copia-inizializzazione è sostanzialmente equivalente a diretta inizializzazione, cioè:

Foo g(f); // or even Foo g{f} in C++11 

L'unica differenza è che se il costruttore di copie di è contrassegnato come explicit (difficile immaginare il motivo per cui sarebbe il caso), la risoluzione di sovraccarico fallirà nel caso di inizializzazione della copia.

1
Foo g = f; // (*) 

copy constructor viene richiamato .Io chiamato inizializzazione della copia dell'oggetto.

Se non è stato scritto il costruttore di copie nella classe Foo, viene chiamato il costruttore di copie generato dal compilatore.

2

g viene effettivamente creato come una copia di f.

Un modo semplice per ricordare cosa significa in realtà, è solo rispondere alla domanda: è g già esistente?

{ 
    Foo g; //g construction ends here (at ';') 
    g = f; // assignment (the g previous value is replaced) 
} 

{ 
    Foo g = f; //copy (same as Foo g(f): there is no "previous g" here) 
} 
+0

A g = f vuoi dire che è un assunzionamento quindi è un uso "=" dell'operatore, e non una copia ctr giusta? –

+0

esattamente; questo perché g esiste già, essendo dichiarato appena sopra. –

Problemi correlati