传递值/引用是否分别相当于制作深层/浅层副本?

马修·米隆(Matthew Milone)

如果有人以不同的方式在搜索栏中键入问题,请重新措辞该问题:“按值传递”是否等同于进行深层复制,而“按引用传递”是否等同于进行浅层复制?

如果没有,有什么区别?在Python(我最熟悉的语言)中,它们似乎无法区分。

newacct

否。这两件事是完全无关的。

浅拷贝/深拷贝是指对象复制而按值传递/按引用传递则是在谈论变量传递

在许多现代语言中,例如Python(您最熟悉的语言)和Java,“对象”不是该语言中的值,因此无法分配或传递“对象”。而是总是通过指向对象(引用)的指针来操纵对象,这些对象是值,可以分配或传递。

Python和Java只是按值传递。当您传递引用时,它会复制指针,最后您将有两个指针指向同一对象。没有对象复制发生。在这些语言中,对象复制不是通过分配或传递来完成的,而是通过调用特殊方法(例如.clone(),通过将对象传递给构造函数或构造一个新对象)来完成的。(实际上,没有使用Java复制对象的通用方法。)

有一些语言,例如C ++,其中对象可以是值(当然,您也可以具有指向对象的指针,这些指针的工作方式类似于其他语言中的引用)。C还具有按值传递和按引用传递。如果通过引用传递对象,则不会进行复制。如果按值分配或传递对象,则会复制该对象。但是默认情况下,这是浅表副本。

浅表副本和深表副本之间的区别是它们如何处理对象的成员,这些成员是指向另一个对象的指针。不是指针的成员将被简单复制;没有“浅”或“深”的概念。“浅”或“深”仅讨论作为指针的成员-是否复制指向的对象。C ++中的默认赋值运算符和复制构造函数仅复制每个成员。对于作为指针的成员,这意味着将复制指针,因此您有两个指向同一对象的指针。那是浅表。

如果作为指向另一个对象的指针的成员确实指向实际上是对象“一部分”的“子对象”,则可能需要“深层”副本(指向另一个对象的指针是否意味着一个子对象) -object是否取决于对象的设计),因此您不希望多个对象指向同一个子对象,这就是为什么要在复制主对象时复制子对象的原因。要在C ++中实现此功能,您需要实现一个自定义赋值运算符和一个自定义副本构造函数,以便在复制过程中复制“子对象”。在其他语言中,类似地,您将需要自定义所使用的任何复制方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章