有人可以解释以下之间的区别:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
和
(2.)
newObj := oldObj;
2. 是否newObj
和oldObj
指的是同一个对象?
抱歉,如果之前已经介绍过但很难搜索:=
有人可以解释以下之间的区别:
(1.)
newObj := TMyObject.Create;
newObj.Assign(oldObj);
和
(2.)
newObj := oldObj;
2. 是否newObj
和oldObj
指的是同一个对象?
抱歉,如果之前已经介绍过但很难搜索:=
newObj := TMyObject.Create;
newObj.Assign(oldObj);
假设Assign
正确实施,这
TMyObject
(via Create
)的新实例newObj
(通过:=
运算符)oldObj
,制作(via )newObj
的功能精确副本。oldObj
Assign
这里的最终结果是您有两个完全独立的实例,TMyObject
此时它们是彼此的精确副本。
newObj := oldObj;
上面只是复制一个引用oldObj
并将其存储在变量中newObj
。在这种情况下,您仍然只有一个TMyObject
和两个变量的实例,newObj
并且oldObj
指向同一个实例。如果您使用任一变量修改该对象的状态,则两者都将反映这些更改,因为它们都指向同一个基础对象。
这与上面的示例形成对比,在上面的示例中,您有两个单独的对象,它们的状态可以随着两个对象的独立修改而发散。
从概念上讲,对象(类)的变量通常被称为“引用类型”。这种类型的变量本质上只是指针(如果这更熟悉的话)。具有引用类型的赋值 ( :=
) 仅复制对对象的引用,而不是对象本身。
唯一的例外是string
类型,它具有引用类型的许多属性,但由编译器管理以在许多方面也表现为值类型(修改字符串会产生新的修改副本,而不是修改原始字符串,这可能是其他地方引用)。