2015-05-13 47 views
9

Io e un mio collega ha avuto un dibattito sulla castratoC++ Strano costruttore di copia di default senza costruttore

Pt pt; 

e

Pt pt = Pt(); 

sono equivalenti. Sospettavo che nel secondo caso si potesse chiamare il compito di copia, ma a quanto pare non è così.

Mentre correvamo il nostro piccolo esperimento ho deciso di provare un po 'strano, che il mio collega pensava non sarebbe nemmeno compilare:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that 
// O_o 
Pt pt = pt; 

Ecco un esempio di lavoro: http://ideone.com/XmJSz7

Quindi, la domanda è - ciò che accade in:

Pt pt = pt; 
+0

"* Avevo il sospetto che nel secondo caso si potesse chiamare l'assegnazione della copia, ma come risulta non è il caso. *" Sospetto che tu stia concludendo dal fatto che qualcosa non è accaduto che non potrebbe accadere. Questo è un ragionamento non valido. Se cammino per la strada senza guardare in entrambi i modi e non viene investito da un'auto, vuol dire che qualcuno che ha detto che avrei potuto essere colpito da una macchina non era corretto? –

+0

Punto valido. Suggerite che Pt pt = Pt(); potresti chiamare il costruttore della copia in qualche caso? Se sì - potresti fare un esempio? –

+0

@Vorren - su questo 'Pt pt = Pt()', ho aggiornato la mia risposta. –

risposta

5

costruzioni come type object = something costruttori di copia delle chiamate, non operatori di assegnazione

Avendo questo in mente, ecco cosa succede:

  1. Pt pt = -> a questo punto, si crea Pt oggetto, denominato pt (nulla viene inizializzato a questo punto)
  2. = pt; -> a questo punto , pt 's copia costruttore viene chiamato con l'argomento - per sé (pt)
  3. come pt si crea ma non inizializzato (in 1.), questo è (kinda) valida - pt' s copia co nstructor (in 2.) sarà "correttamente" eseguita, prendendo come argomento di destra-mano-lato il già esistente e non inizializzato oggetto pt (da 1. nuovo)

Poco - questo è male.

Vale la pena notare che, se l'oggetto pt è globale o statico, esso sarà essere default-inizializzato nella fase 1. - dopo aver raggiunto la =.

EDIT: per quanto riguarda il "puzzle" iniziale Pt pt = Pt();, si può vedere questa domanda: Is there a difference in C++ between copy initialization and direct initialization? e la sua risposta accettata. E anche questo sembra interessante: How variable is initialized by default constructor in c++

Problemi correlati