Copie profonde ou superficielle en programmation
La copie superficielle implique la création d'un nouvel objet qui fait référence aux mêmes données sous-jacentes que l'original. En revanche, la copie profonde construit un nouvel objet qui contient des doublons indépendants de toutes les données associées à l'original.
Considérez la classe C suivante :
<code class="c++">class X { public: int i; int *pi; X() : pi(new int) {} X(const X& copy) : i(copy.i), pi(copy.pi) {} };</code>
Dans ce cas, une copie superficielle en résultera dans les objets X originaux et copiés pointant vers le même objet int lors de l'attribution de pi :
<code class="c++">X original; X copy(original);</code>
D'autre part, la copie profonde inclut une étape dans le constructeur de copie où un nouvel objet int est alloué :
<code class="c++">class X { public: int i; int *pi; X() : pi(new int) {} X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {} };</code>
En conséquence, l'objet X copié aura son propre objet int avec la même valeur que l'original.
Au départ, on pensait que le constructeur de copie par défaut effectuait toujours des copies superficielles. Cependant, il a été précisé que le comportement dépend du type de chaque membre. La norme spécifie la copie par membre, ce qui signifie que les types scalaires (comme int dans cet exemple) sont copiés à l'aide de l'opérateur d'affectation intégré.
Par conséquent, le choix entre la copie profonde et superficielle dépend des exigences spécifiques de l'application. et les caractéristiques des données copiées.
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!