È un costruttore di copie?

class A {}; class B { public: B (A a) {} }; A a; B b=a; 

Tecnicamente parlando, un costruttore di copie viene applicato qui sulla creazione di b ?

Tecnicamente parlando, un costruttore di copie viene applicato qui sulla creazione di b?

Sì … ma probabilmente non come pensi. A costruttore di copie di A viene invocato per la creazione di b, al fine di eseguire il pass-by-value del parametro A a come parametro per il costruttore B.

Tuttavia , non sta eseguendo il costruttore di copie di B nella creazione di b.


EDIT: si impara qualcosa di nuovo ogni giorno. Apparentemente anche più tecnicamente parlando, come ha sottolineato @CharlesBailey … se usi B b = a; syntax (“inizializzazione della copia”) anziché B b (a); syntax (“inizializzazione diretta”), potrebbe essere necessario creare un valore temporaneo di tipo B. A questo punto il costruttore di copie di B finirebbe per essere chiamato.

È un po ‘difficile studiare il fenomeno, ma Charles sottolinea che gcc ha un’opzione -fno-elide-constructors (anche: Wikipedia su Copy Elision ) @ Il link di JesseGood ha una spiegazione esauriente e un codice dimostrativo:

Esiste una differenza in C ++ tra l’inizializzazione della copia e l’inizializzazione diretta?

Sì, in teoria. Questa è la copia-inizializzazione . Prima viene costruita un’istanza B temporanea dall’inizializzatore ( a ), quindi b viene inizializzato da questo temporaneo tramite il costruttore di copie.

Ai compilatori è permesso, e frequentemente lo fanno, di elidere il temporaneo e la costruzione della copia, però, e di build b direttamente da a costruttore di B(A) .

No, un costruttore di copie prende un riferimento a un object dello stesso tipo.

C ++ 03 12.1 Costruttori

  1. Un costruttore di copie per una class X è un costruttore con un primo parametro di tipo X& o const X& .

EDIT: OK, per essere onesti (e dopo aver letto le altre risposte), viene chiamato un costruttore di copia, ma è il costruttore di copie di A Pensavo intendessi B ‘s.

EDIT2: per essere più giusti, non è necessario che venga chiamato affatto:

 A a; B b = a; //called B c = A(); //probably not called due to copy elision 

No. Non è un costruttore di copie.

Se si crea un object inizializzandolo con un object della stessa class , si tratta del costruttore della copia.

 A a; A b=a; 

Il codice sopra è copia Costruttore.