Répondre

1

Non Ces deux choses sont sans aucun rapport.

La copie peu profonde/copie profonde parle de Copie d'objet; tandis que valeur par passe/référence par référence parle du passage des variables . Dans de nombreux langages modernes, comme Python (dont vous avez dit être le plus familier) et Java, les «objets» ne sont pas des valeurs dans la langue, de sorte que les «objets» ne peuvent pas être attribués ou transmis. Au contraire, les objets sont toujours manipulés à l'aide de pointeurs vers des objets (références), qui sont des valeurs et peuvent être attribués ou transmis.

Python et Java sont des valeurs de transfert uniquement. Lorsque vous passez une référence, il copie le pointeur et vous vous retrouvez avec deux pointeurs sur le même objet. Aucune copie d'objet ne se produit. Dans ces langages, la copie d'objet n'est pas effectuée par l'affectation ou la transmission, mais plutôt par l'appel de méthodes spéciales telles que .clone() ou en passant un objet à un constructeur pour construire un nouvel objet. (Il n'y a en fait pas de façon générale de copier un objet en Java.)

Il existe des langages, comme le C++, où les objets peuvent être des valeurs (bien sûr, vous pouvez aussi avoir des pointeurs vers des objets, qui fonctionnent de manière similaire aux références dans d'autres langues). C a aussi à la fois la valeur par passe et la référence par passe. Si vous passez un objet par référence, aucune copie ne se produit. Si vous affectez ou transmettez un objet par valeur, l'objet est copié. Mais par défaut, il s'agit d'une copie superficielle. La distinction entre copie superficielle et copie profonde est la façon dont ils traitent les membres de l'objet qui sont des pointeurs vers un autre objet. Les membres qui ne sont pas des pointeurs sont simplement copiés; il n'y a pas de concept de "shallow" ou "deep". "Shallow" ou "deep" ne parle que des membres qui sont des pointeurs - que ce soit pour copier l'objet pointé ou non. L'opérateur d'affectation par défaut et le constructeur de copie en C++ copient simplement chaque membre. Pour les membres qui sont des pointeurs, cela signifie que le pointeur est copié et ainsi vous avez deux pointeurs vers le même objet. C'est une copie superficielle. Vous voudrez peut-être une copie "profonde" dans les cas où le membre qui est un pointeur vers un autre objet pointe vraiment vers un "sous-objet" qui fait vraiment partie de votre objet (qu'il s'agisse d'un pointeur vers un autre objet signifie un sous-objet ou non dépend de la conception de vos objets), donc vous ne voulez pas que plusieurs de vos objets pointent sur le même sous-objet, et c'est pourquoi vous voulez copier le sous-objet lors de la copie objet. Pour l'implémenter en C++, vous devez implémenter un opérateur d'affectation personnalisé et un constructeur de copie personnalisé pour copier les "sous-objets" dans le processus de copie. Dans d'autres langues, vous devez également personnaliser la méthode de copie utilisée.

-1

Oui, passez par valeur fait une copie en profondeur et passe par référence fait une copie superficielle