Sam*_*ral 12 delphi parameter-passing
在Delphi中,如果我有一个简单的类myClass
,我将它的一个实例传递给一个函数myFunction( myClass )
,由function myFunction( myObject : myClass ) : Boolean
... 定义
是否会制作myObject的副本?
当我在myFunction中调用myObject的方法时,原始对象是否也会受到影响和修改?
And*_*and 23
对象通过引用传递.不会制作副本; 只有一个实例,只有一个对象.原始对象就是全部.
vcl*_*per 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.
Run Code Online (Sandbox Code Playgroud)
另请注意,参数修饰符(例如Var,Const,Out)仅更改对象引用传递给函数的方式,并且不会影响原始数据结构.
也许这篇文章清除了有关在Delphi中为函数传递参数的不同方法的更多信息:
Delphi中不同的函数参数修饰符(存档版本)
它比"通过引用传递对象"更多.对象是引用类型,因此默认情况下它们总是通过引用传递.任何对象变量都是对象引用.
但是如果你通过"引用"传递一个对象变量(对一个var参数),那么如果用你传递给它的例程中的另一个对象替换该对象,那么一旦例程返回,你将得到一个不同的对象. .这样做时要小心; 如果您更改对某个对象的唯一引用,它可能会导致内存泄漏.
归档时间: |
|
查看次数: |
14034 次 |
最近记录: |