Création d'une fonction commune pour le constructeur de copie et l'opérateur d'affectation
Un constructeur de copie et une surcharge d'opérateur d'affectation partagent souvent un code similaire et ne diffèrent que par leur type de retour. Pouvons-nous simplifier cela en créant une fonction commune que les deux peuvent utiliser ?
Option 1 : appeler explicitement Operator= à partir du constructeur de copie
MyClass(const MyClass& other) { operator=(other); }
Cette approche est généralement déconseillée car cela introduit des problèmes avec l’ancienne gestion étatique et l’auto-affectation. De plus, il initialise par défaut tous les membres, même s'ils sont affectés à partir de l'autre objet.
Option 2 : Implémentation de l'opérateur = Utilisation du constructeur de copie et de l'échange
Un choix préféré La solution implique d'implémenter Operator= en utilisant le constructeur de copie et une méthode d'échange :
MyClass& operator=(const MyClass& other) { MyClass tmp(other); swap(tmp); return *this; }
Ou même :
MyClass& operator=(MyClass other) { swap(other); return *this; }
La fonction d'échange échange la propriété des données internes sans nettoyer l'état existant ni allouer de nouvelles ressources. Cette approche est sécurisée pour l'auto-affectation et fortement sécurisée pour les exceptions, à condition que l'opération d'échange soit sans lancer.
Précautions :
Assurez-vous que la méthode d'échange effectue une véritable swap, pas le std::swap par défaut, qui repose sur le constructeur de copie et l'opérateur d'affectation lui-même. Utilisez l'échange par membre pour les types primitifs et les types de pointeurs afin de garantir un comportement sans lancer.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!