在Delphi中,如果我有一个简单的类myClass
并将其实例传递给一个带有myFunction (myClass)的函数,该函数由
function myFunction(myObject:myClass):Boolean
定义...
是否会创建myObject的副本?
当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?
答案:
不会,与原始对象相同的指针将被传递。
是的,因为您拥有对原始对象的指针,并可以修改它。
在Delphi中,如果我有一个简单的类myClass
并将其实例传递给一个带有myFunction (myClass)的函数,该函数由
function myFunction(myObject:myClass):Boolean
定义...
是否会创建myObject的副本?
当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?
答案:
不会,与原始对象相同的指针将被传递。
是的,因为您拥有对原始对象的指针,并可以修改它。
对象按引用传递。不会创建副本;只会有一个类的实例,只有一个对象。原始对象就是全部内容。
在 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中不同的参数传递方式:
Delphi中不同的函数参数修饰符 (存档版本)
AnObj
in main body should be changed to MyObj
- VassilisTObject
的变量是一个错误的叫法... MyForm.Width
是持有MyForm
变量引用的窗体的真实宽度。你改变了MyForm
变量,MyForm.Width
就是另一个窗体的宽度。因此,“你最终会得到一个不同的对象”在实践中有些描述了程序员的现实。 - Francesca对象是按引用传递的。