Existe-t-il des inconvénients à une telle implémentation du constructeur de copies?
Foo::Foo(const Foo& i_foo) { *this = i_foo; }
Si je me souviens bien, dans certains livres, il était recommandé d’appeler le constructeur de copie à partir d’opérateur d’affectation et d’utiliser une astuce d’échange bien connue, mais je ne me souviens pas pourquoi …
Oui, c’est une mauvaise idée. Toutes les variables membres de types définis par l’utilisateur seront d’abord initialisées, puis immédiatement écrasées.
Cette astuce d’échange est la suivante:
Foo& operator=(Foo rhs) // note the copying { rhs.swap(*this); //swap our internals with the copy of rhs return *this; } // rhs, now containing our old internals, will be deleted
Il existe à la fois des inconvénients et des gains potentiels liés à l’appel de l’ operator=()
dans votre constructeur.
Votre constructeur initialisera toutes les variables membres, que vous spécifiiez des valeurs ou non, puis operator=
les initialisera à nouveau. Cela augmente la complexité d’exécution. Vous devrez prendre des décisions éclairées pour savoir quand cela créera un comportement inacceptable dans votre code.
Votre constructeur et votre operator=
deviennent étroitement couplés. Tout ce que vous devez faire lors de l’instanciation de votre object sera également fait lors de la copie de votre object. Encore une fois, vous devez être intelligent pour déterminer s’il s’agit d’un problème.
Vous recherchez Effective C ++ Item 12 de Scott Meyers : Copiez toutes les parties d’un object.