Maison  >  Article  >  développement back-end  >  Copie approfondie ou copie superficielle : quand ai-je besoin d'une copie fidèle de mes données ?

Copie approfondie ou copie superficielle : quand ai-je besoin d'une copie fidèle de mes données ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 11:01:30833parcourir

 Deep Copy vs. Shallow Copy: When Do I Need a True Copy of My Data?

Copie approfondie et copie superficielle

Question :

Quelles sont les principales différences entre copie profonde et copie superficielle ?

Réponse :

Copie superficielle :

  • Copie les valeurs de l'objet mais conserve références à des objets partagés.
  • Exemple :

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(copy.pi) {}
    };</code>

    Dans cette copie superficielle, pi fait référence au même objet int dans les objets original et copié.

Copie approfondie :

  • Crée une copie complète de l'objet d'origine, y compris tous les objets incorporés.
  • Exemple :

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {}
    };</code>

    Dans cette copie complète, pi pointe vers un nouvel objet int avec la même valeur que l'original.

Type de constructeur de copie :

Le constructeur de copie par défaut dépend du comportement du constructeur de copie de chaque membre :

  • Pour les types scalaires, l'opérateur d'affectation par défaut est utilisé, ce qui donne une copie superficielle.
  • Cependant, il n'est pas strictement correct de dire que le constructeur de copie par défaut effectue toujours une copie superficielle. Il pourrait implémenter une copie approfondie, ou même une combinaison de copie profonde et superficielle, en fonction des comportements de copie des types de membres.

Exemple :

Dans Dans l'exemple suivant, le constructeur de copie par défaut crée une copie complète pour le membre std::vector en raison de son implémentation :

<code class="c++">class Y {
private:
    std::vector<int> v;
public:
    Y() {}
    Y(const Y& copy) : v(copy.v) {}
};</code>

Dans ce cas, le constructeur de copie de std::vector crée une copie complète de son contenu.

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