Maison >développement back-end >C++ >Une fonction commune peut-elle simplifier les surcharges des constructeurs de copie et des opérateurs d'affectation ?

Une fonction commune peut-elle simplifier les surcharges des constructeurs de copie et des opérateurs d'affectation ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-27 03:15:12464parcourir

Can a Common Function Simplify Copy Constructor and Assignment Operator Overloads?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn