Los constructores de copia explícitamente definidos no llaman a los constructores de copia para los miembros.
Cuando ingresa el cuerpo de un constructor, cada miembro de esa clase se inicializará. Es decir, una vez que llegue al {
, se le garantiza que todos sus miembros se hayan inicializado.
A menos que se especifique, los miembros se inicializan por defecto en el orden en que aparecen en la clase. (Y si no pueden serlo, el programa está mal formado). Por lo tanto, si define su propio constructor de copia, ahora depende de usted llamar a cualquier constructor de copia miembro como lo desee.
Aquí es un pequeño programa que puede copiar y pegar en algún lugar y perder el tiempo 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);
}
que está, en este grabados:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
Nota que está predeterminado-inicialización de los miembros de Baz
.
comentando las constructor de copia explícita, como:
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
La salida será el siguiente:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
llama al constructor de copia en ambos.
Y si reintroducimos Baz
's constructor de copia y copiar explícitamente un solo miembro:
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
Obtenemos:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
Como se puede ver, una vez que se declara explícitamente un constructor de copia usted son responsables de la copia de todos los miembros de la clase; es tu constructor ahora.
Esto se aplica a todos los constructores, incluidos los constructores de movimiento.
Ver: http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –