Appel de l’opérateur d’affectation dans le constructeur de copie

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.

Désavantages:

  • 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.

Gains:

  • La base de code devient moins complexe et plus facile à maintenir. Encore une fois, soyez intelligent pour évaluer ce gain. Si vous avez une structure avec 2 membres de chaîne, cela n’en vaut probablement pas la peine. D’autre part, si vous avez une classe avec 50 membres de données (vous ne devriez probablement pas mais c’est une histoire pour un autre article) ou des membres de données qui ont une relation complexe entre eux, il pourrait y avoir beaucoup d’avantages à avoir un seul fonction init au lieu de deux ou plus.

Vous recherchez Effective C ++ Item 12 de Scott Meyers : Copiez toutes les parties d’un object.