在Delphi中,如果我有一个简单的类myClass
,我将它的实例传递给myFunction( myClass )
的函数,该函数由function myFunction( myObject : myClass ) : Boolean
...
是否会制作myObject的副本?
当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?
答案 0 :(得分:23)
通过引用传递对象。不会制作副本;只有一个实例,只有一个对象。原始对象就是。
答案 1 :(得分:16)
在Delphi中,对象是指向堆内存上的数据结构的特殊指针。将对象传递给函数时,实际上是传递指针,而不是整个对象数据的副本。在这种情况下,当您通过该引用修改字段或属性时,它将影响原始对象数据。这是一个演示此行为的简单示例:
program ObjParamTest;
type
TMyClass = class
private
FMyField : Integer;
public
property MyField : Integer read FMyField write FMyField;
end;
function ModifyObject(AnObj: TMyClass);
begin
AnObj.MyField := AnObj.MyField + 1;
end;
var
MyObj : TMyClass;
begin
MyObj := TMyClass.Create;
try
AnObj.MyField := 2;
Writeln(AnObj.MyField); // ==> Prints 2
ModifyObject(MyObj);
Writeln(AnObj.MyField); // ==> Prints 3
finally
MyObj.Free;
end;
end.
另请注意,参数修饰符(例如Var,Const,Out)仅更改对象引用传递给函数的方式,并且不会影响原始数据结构。
也许这篇文章清除了有关在Delphi中将参数传递给函数的不同方法的内容:
答案 2 :(得分:7)
它比“通过引用传递对象”更多。对象是引用类型,因此默认情况下它们总是通过引用传递。任何对象变量都是对象引用。
但是如果你通过“引用”传递一个对象变量(对于 var 参数),那么如果用你传递给它的例程中的另一个对象替换该对象,你将会例程返回后,最终会得到一个不同的对象。这样做时要小心;如果您更改对某个对象的唯一引用,它可能会导致内存泄漏。
答案 3 :(得分:4)
通过引用传递对象。