Les constructeurs de copie définis explicitement n'appellent pas de constructeurs de copie pour les membres.
Lorsque vous entrez le corps d'un constructeur, chaque membre de cette classe sera initialisé. C'est-à-dire, une fois que vous obtenez à {
vous êtes garanti que tous vos membres ont été initialisés.
Sauf indication contraire, les membres sont initialisés par défaut dans l'ordre dans lequel ils apparaissent dans la classe. (Et s'ils ne peuvent pas l'être, le programme est mal formé.) Donc, si vous définissez votre propre constructeur de copie, il vous appartient maintenant d'appeler n'importe quel constructeur de copie de membre comme vous le souhaitez.
Voici un petit programme que vous pouvez coller copier quelque part et mess avec:
#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);
}
As-est, cette impression:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo()
In Bar::Bar()
In Baz::Baz(const Baz&)
Notez qu'il est réinitialisant par défaut les membres de Baz
.
En commentant le constructeur de copie explicite, comme:
/*
Baz(const Baz& rhs) {
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
*/
La sortie deviendra ceci:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar(const Bar&)
Il appelle le constructeur de copie sur les deux.
Et si nous réintroduisons Baz
EXEMPLAIRE constructeur et copier explicitement un seul membre:
Baz(const Baz& rhs) :
foo(rhs.foo)
{
std::cout << "In Baz::Baz(const Baz&)" << std::endl;
}
Nous obtenons:
In Foo::Foo()
In Bar::Bar()
In Baz::Baz()
Copying...
In Foo::Foo(const Foo&)
In Bar::Bar()
In Baz::Baz(const Baz&)
Comme vous pouvez le voir, une fois que vous déclarez explicitement un constructeur de copie vous sont responsables de la copie de tous les membres du groupe; c'est votre constructeur maintenant.
Cela s'applique à tous les constructeurs, y compris les constructeurs de déplacement.
Voir: http://stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c/563320#563320 –