有人可以解释一下以下之间的区别:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
and
(2.)
newObj := oldObj;
2. 确实newObj
and oldObj
引用同一个对象?
抱歉,如果之前已经介绍过此内容,但很难搜索:=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
假如说Assign
正确实施,这
- 创建一个新实例
TMyObject
(via Create
)
- 在变量中存储对该实例的引用
newObj
(通过:=
操作员)
- 执行深度复制
oldObj
, 制作newObj
功能上完全相同的副本oldObj
(via Assign
).
这里的最终结果是你有两个完全独立的实例TMyObject
此时,它们是彼此的精确副本。
newObj := oldObj;
上面只是复制了一个参考oldObj
并将其存储在变量中newObj
。在这种情况下,您仍然只有一个实例TMyObject
和两个变量newObj
and oldObj
指向同一个实例。如果您使用任一变量修改该对象的状态,则两个变量都将反映这些更改,因为它们都指向同一基础对象。
这与上面的示例形成鲜明对比,在上面的示例中,您有两个单独的对象,当两个对象独立修改时,它们的状态可能会有所不同。
从概念上讲,对象(类)的变量一般称为“参考类型“。这种类型的变量本质上只是指针(如果这更熟悉的话)。赋值(:=
) 引用类型仅复制对对象的引用,而不是对象本身。
唯一的实质性例外是string
类型,具有引用类型的许多属性,但由编译器管理,在许多方面也表现为值类型(修改字符串会生成新的修改副本,而不是修改可能在其他地方引用的原始字符串)。
也可以看看 :要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性? https://stackoverflow.com/q/24887218/327083
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)