9

有人可以解释以下之间的区别:

(1.)

newObj := TMyObject.Create;
newObj.Assign(oldObj);

(2.)

newObj := oldObj;

2. 是否newObjoldObj指的是同一个对象?

抱歉,如果之前已经介绍过但很难搜索:=

4

1 回答 1

8
newObj := TMyObject.Create; 
newObj.Assign(oldObj);

假设Assign正确实施,这

  • 创建TMyObject(via Create)的新实例
  • 将对该实例的引用存储在变量中newObj(通过:=运算符)
  • 执行 的深层复制oldObj,制作(via )newObj的功能精确副本。oldObjAssign

这里的最终结果是您有两个完全独立的实例,TMyObject此时它们是彼此的精确副本。


newObj := oldObj;

上面只是复制一个引用oldObj并将其存储在变量中newObj。在这种情况下,您仍然只有一个TMyObject和两个变量的实例,newObj并且oldObj指向同一个实例。如果您使用任一变量修改该对象的状态,则两者都将反映这些更改,因为它们都指向同一个基础对象。

这与上面的示例形成对比,在上面的示例中,您有两个单独的对象,它们的状态可以随着两个对象的独立修改而发散。


从概念上讲,对象(类)的变量通常被称为“引用类型”。这种类型的变量本质上只是指针(如果这更熟悉的话)。具有引用类型的赋值 ( :=) 仅复制对对象的引用,而不是对象本身。

唯一的例外是string类型,它具有引用类型的许多属性,但由编译器管理以在许多方面也表现为值类型(修改字符串会产生新的修改副本,而不是修改原始字符串,这可能是其他地方引用)。

另请参阅:要从一个对象复制到另一个对象,我可以直接分配变量,还是必须单独分配它们的属性?

于 2015-12-27T14:53:15.427 回答