有人能解释一下之间的区别吗
(1)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
和
(2)
newObj := oldObj;
在2。newObj
和oldObj
指的是同一个对象吗?
很抱歉,如果之前已经报道过,但很难搜索:=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
假设Assign
被正确地实现,这个
- 创建
TMyObject
的新实例(通过Create
) - 在变量
newObj
中存储对该实例的引用(通过:=
运算符) - 执行
oldObj
的深度复制,使newObj
成为oldObj
的功能精确副本(通过Assign
)
这里的最终结果是,您有两个完全独立的TMyObject
实例,在这一点上,它们是彼此的精确副本。
newObj := oldObj;
以上只是复制对oldObj
的引用,并将其存储在变量newObj
中。在这种情况下,仍然只有TMyObject
的一个实例,并且变量newObj
和oldObj
都指向同一个实例。如果使用任一变量修改该对象的状态,则两者都将反映这些更改,因为它们都指向同一基础对象。
这与上面的例子相反,在上面的例子中,有两个单独的对象,当两个对象都被独立修改时,它们的状态可能会发生分歧。
从概念上讲,对象(类)的变量通常被称为"引用类型"。这种类型的变量本质上只是指针(如果更熟悉的话)。具有引用类型的赋值(:=
)只复制对对象的引用,而不是对象本身。
唯一的实质性例外是string
类型,它具有引用类型的许多属性,但由编译器管理,在许多方面也表现为值类型(修改字符串会产生新的修改副本,而不是修改可能在其他地方引用的原始字符串)。
另请参阅:要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性?