web-dev-qa-db-fra.com

Le constructeur de copie et l'opérateur d'affectation

Si je remplace operator= le constructeur de copie utilisera-t-il automatiquement le nouvel opérateur? De même, si je définis un constructeur de copie, operator= "hérite-t-il" automatiquement du comportement du constructeur de copie?

50
Paul Manta

Non, ce sont des opérateurs différents.

Le constructeur de copie sert à créer un nouvel objet. Il copie un objet existant dans un objet nouvellement construit. Le constructeur de copie est utilisé pour initialiser une nouvelle instance à partir d'une ancienne instance. Il n'est pas nécessairement appelé lors du passage de variables par valeur dans des fonctions ou comme valeurs de retour hors des fonctions.

L'opérateur d'affectation doit traiter un objet déjà existant. L'opérateur d'affectation est utilisé pour modifier une instance existante afin qu'elle ait les mêmes valeurs que la valeur r, ce qui signifie que l'instance doit être détruite et réinitialisée si elle possède une mémoire dynamique interne.

Lien utile:

44
sgokhales

Non. Sauf si vous définissez un ctor de copie, une valeur par défaut sera générée (si nécessaire). Sauf si vous définissez un opérateur =, une valeur par défaut sera générée (si nécessaire). Ils ne s'utilisent pas et vous pouvez les modifier indépendamment.

12
Erik

Ce sont des objets différents.

Si votre problème concerne la duplication de code entre le constructeur de copie et l'opérateur d'affectation, considérez l'idiome suivant, nommé copier et échanger :

struct MyClass
{
    MyClass(const MyClass&); // Implement copy logic here
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)

    MyClass& operator=(MyClass x)
    {
        x.swap(*this);
        return *this;
    }
};

De cette façon, le operator= utilisera le constructeur de copie pour construire un nouvel objet, qui sera échangé avec *this et libéré (avec l'ancien this à l'intérieur) à la sortie de la fonction.

5
Alexandre C.

Non, ce n'est pas le même opérateur.

1
Jonathan Wood

Non.

Et jetez un œil à la règle des trois (ou règle des cinq lorsque vous tenez compte des valeurs))

0
stijn