Copie peu profonde vs. Copie profonde
Avant de regarder l'exemple de copie profonde, il faut également comprendre la copie superficielle. Ainsi, la copie superficielle a été créée lorsque vous souhaitez copier toutes les variables d'un objet à un autre objet. Vous pouvez l'appeler une image miroir, mais ce n'est pas l'original. Les objets originaux et nouveaux, je.e., réplique, référencera la même adresse mémoire dans la copie superficielle. Cela signifie que les objets originaux et répliques seront reconnus et récupérés avec la même adresse mémoire. Lorsqu'un utilisateur essaie d'apporter des modifications dans un objet, il reflétera automatiquement le changement dans un autre objet également en raison de la même adresse mémoire. Cela peut entraîner de nombreuses erreurs pendant l'exécution, et l'objet réel et réplique sera détruit. Ainsi, on dit qu'il évite d'utiliser une copie peu profonde lorsque vous avez travaillé avec des variables allouées dynamiquement d'un certain objet.
Il est recommandé d'utiliser la copie profonde au lieu de la copie peu profonde tout en utilisant les variables allouées dynamiquement. La copie profonde peut être obtenue en copiant toutes les données d'un objet, i.e., Valeurs variables, allocation de mémoire et ressources à la nouvelle tandis que l'objet réel et réplique a une adresse mémoire complètement différente. Il peut être utilisé pour un objet ayant des variables qui sont allouées dynamiquement. Alors, commençons-le.
Exemple: copie profonde
Nous avons commencé notre exemple pour démontrer le concept de copie profonde dans la programmation C ++ en ouvrant la console de shell de l'Ubuntu 20.04 Système. La première chose à faire est de produire un nouveau fichier C ++ pour le code. La commande éternelle, ancienne et la plus simple fournie par la distribution Linux pour créer un document dans son terminal de coquille est l'instruction «Touch». Le mot simple «Touch» sera utilisé avec le titre d'un document à générer. Assurez-vous d'ajouter l'extension C ++ à la fin du nom du document; Sinon, le code ne fonctionnera pas sur le shell lors de l'exécution du fichier. Après cette création de fichiers, il y a le pas pour l'ouvrir.
La meilleure chose à propos de l'ubuntu 20.04 est qu'il est livré avec des éditeurs intégrés pour ouvrir et modifier les fichiers. Il contient l'éditeur «VIM» à modifier dans un environnement très coloré, l'éditeur de texte pour mettre à jour et modifier le code dans l'environnement le plus simple, et l'éditeur GNU Nano pour créer et modifier le code dans le shell. Ainsi, nous avons rejeté l'éditeur de code, je.e., GNU Nano Editor dans notre cas, et le Nano Word est utilisé pour ouvrir le document «Deep.CC ". Les instructions pour générer et lancer le document «Deep.CC ”sont indiqués dans la capture d'écran ci-dessous.
Après que l'éditeur GNU Nano pour Code a lancé le document texte «Deep.CC ”Dedans, nous devons d'abord y ajouter des bibliothèques. Ces bibliothèques sont nécessaires pour l'exécution du code d'une certaine manière. Le flux d'entrée-sortie «IO» est inclus en utilisant le mot «inclure» avec un caractère de hachage, je.e., "#". L'utilisation d'un espace de noms standard est nécessaire pour que le code C ++ utilise les instructions CIN et COUT. Le code a été lancé avec la déclaration d'une nouvelle classe nommée «Test». Cette classe a été initialisée avec trois membres de données entiers de type privé. Les variables «len» et «wid» sont les variables entières normales, tandis que «l'âge» est une variable de pointeur. Le constructeur test () a été initialisé et il est utilisé pour initialiser directement «l'âge» du pointeur avec une valeur de type entier dynamiquement.
Une fonction définie par l'utilisateur nommé «set» sans type de retour a été démarrée. Il prend trois arguments de type entier dans ses paramètres, i.e., «L», «W» et «A». Cette fonction est utilisée ici pour obtenir les valeurs de la fonction principale () et les stocker dans les variables, ou les membres de données déclarés auparavant au début d'une classe «test» i.e., «Len», «wid» et de type pointeur variable «Âge». Une autre fonction définie par l'utilisateur nommé «Display ()» a été utilisée sans valeurs paramétriques. Cette fonction utilise une seule instruction COUT standard à l'intérieur. L'instruction COUT utilise les variables «len», «wid» et «* Âge» pour afficher les valeurs déjà définies par la fonction set ().
Maintenant, nous utilisons le test de fonction du constructeur paramétré () de la classe «test» pour implémenter le concept de copie profonde dans notre programme. Ce constructeur paramétré sera appelé lorsqu'un nouvel objet sera créé. Il obtient le pointeur de type «test» de classe dans son paramètre, je.e., objet d'origine. Ce premier objet passé dans les paramètres sera utilisé pour copier toutes les données de l'objet d'origine dans le nouvel objet tel qu'il est démontré dans l'image. Le destructeur de test de classe a été utilisé pour détruire l'objet du test de classe tout en supprimant «l'âge» variable de mémoire allouée dynamiquement après l'exécution du programme. La classe de test a été fermée ici, et l'exécution sera lancée avec la fonction principale.
Maintenant, la fonction principale vient. L'exécution commence à partir d'ici lorsque le premier objet, «T1» du test de classe, est créé. Le constructeur «test ()» s'exécutera automatiquement avec la création de l'objet «T1» et attribuera la mémoire dôme dynamique à la variable dynamique «Age» ». La fonction set () a été appelée à l'aide d'objet T1, et pour définir les valeurs sur les variables, la fonction affiche () sera appelée pour afficher les valeurs sur le shell. Le deuxième objet, T2, a été créé de fichier en profondeur en copie toutes les données de l'objet T1 par affectation. Le constructeur paramétré sera appelé ici. Lorsque nous appelons la méthode affichage () avec l'objet T2, il affichera le même résultat que pour l'objet 1. Le destructeur sera exécuté automatiquement lorsque l'objet a fini de travailler.
Après la compilation avec G ++ et l'exécution avec «./un.out », nous avons les mêmes résultats de la méthode affichage () pour les objets T1 et T2.
Conclusion
Dans ce guide d'article, vous découvrirez l'explication de Deep Copy avec un exemple de démonstration. Nous avons commencé ce guide en définissant la copie, la copie profonde et les termes de copie superficielle. Ensuite, nous avons couvert la différence entre l'utilisation de la copie profonde et de la copie superficielle dans le code C ++ pour copier des objets. Nous avons ajouté un exemple bref et simple du programme de copie profonde pour le démontrer davantage. Par conséquent, nous pensons que cet article serait très bénéfique pour tous les utilisateurs naïfs de C ++ et ceux qui sont déjà des experts dans leur domaine.