Maison  >  Article  >  développement back-end  >  Quand le constructeur de copie défini par l’utilisateur est-il nécessaire en C ?

Quand le constructeur de copie défini par l’utilisateur est-il nécessaire en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-24 04:39:02175parcourir

When is User-Defined Copy Constructor Necessary in C  ?

Constructeur de copie défini par l'utilisateur en C

En C, le compilateur génère généralement un constructeur de copie par défaut pour les classes, qui s'exécute par membre copier. Cependant, dans certains scénarios, un constructeur de copie défini par l'utilisateur est nécessaire.

Quand un constructeur de copie défini par l'utilisateur est-il nécessaire ?

Un constructeur de copie défini par l'utilisateur est requis lorsque le comportement de copie par membre du constructeur de copie par défaut est insuffisant. Prenons l'exemple suivant :

<code class="cpp">class Class {
public:
    Class(const char* str);
    ~Class();
private:
    char* stored;
};

Class::Class(const char* str) {
    stored = new char[srtlen(str) + 1];
    strcpy(stored, str);
}

Class::~Class() {
    delete[] stored;
}</code>

Dans cet exemple, le constructeur de copie par défaut copierait simplement le pointeur vers le membre stocké, plutôt que de dupliquer le tampon sous-jacent. Cela peut conduire à un comportement indéfini si une copie est détruite avant l'autre.

Constructeur de copie défini par l'utilisateur

Pour résoudre ce problème, vous pouvez définir une copie définie par l'utilisateur constructeur qui effectue une copie approfondie :

<code class="cpp">Class::Class(const Class& another) {
    stored = new char[strlen(another.stored) + 1];
    strcpy(stored, another.stored);
}</code>

Ce constructeur de copie alloue une nouvelle mémoire et copie le contenu du membre stocké, garantissant que les deux copies ont leurs propres tampons indépendants.

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