I costruttori di copia esplicitamente definiti non chiamano i costruttori di copia per i membri.
Quando si inserisce il corpo di un costruttore, tutti i membri di quella classe verranno inizializzati. Cioè, una volta arrivato a {
hai la certezza che tutti i tuoi membri sono stati inizializzati.
Se non specificato, i membri vengono inizializzati automaticamente nell'ordine in cui appaiono nella classe. (E se non possono essere, il programma è mal formato). Quindi, se si definisce il proprio costruttore di copie, ora spetta a voi chiamare tutti i costruttori di copia dei membri come desiderato.
Ecco un piccolo programma è possibile copiare e incollare da qualche parte e pasticciare con:
#include <iostream>
class Foo {
public:
Foo() {
std::cout << "In Foo::Foo()" << std::endl;
}
Foo(const Foo& rhs) {
std::cout << "In Foo::Foo(const Foo&)" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "In Bar::Bar()" << std::endl;
}
Bar(const Bar& rhs) {
std::cout << "In Bar::Bar(const Bar&)" << std::endl;
}
};
class Baz {
public:
Foo foo;
Bar bar;
Baz() {
std::cout << "In Baz::Baz()" << std::endl;
}
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
};
int main() {
Baz baz1;
std::cout << "Copying..." << std::endl;
Baz baz2(baz1);
}
così com'è, questa stampa:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
Nota che è default-inizializzare i membri del Baz
.
commentando il costruttore di copia esplicita, come:
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
L'uscita sarà questo:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
chiama il costruttore di copia su entrambi.
E se reintrodurre Baz
's costruttore di copia e copiare in modo esplicito un singolo membro:
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
Otteniamo:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
Come si può vedere, una volta che si dichiara in modo esplicito un costruttore di copia è responsabili della copia di tutti i membri della classe; è il tuo costruttore ora.
Questo vale per tutti i costruttori, inclusi i costruttori di spostamenti.
Vedere: http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –