Ответ 1
Объекты передаются по ссылке. Копия не будет сделана; будет только один экземпляр класса, только один объект. Исходный объект - это все, что есть.
В Delphi, если у меня есть простой класс myClass
, и я передаю его экземпляр функции с myFunction( myClass )
, которая определяется function myFunction( myObject : myClass ) : Boolean
...
Будет ли выполнена копия myObject?
Когда я вызываю методы myObject в myFunction, будет ли изменен и изменен исходный объект?
Объекты передаются по ссылке. Копия не будет сделана; будет только один экземпляр класса, только один объект. Исходный объект - это все, что есть.
В 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 (архивная версия)
Там немного больше, чем "объекты передаются по ссылке". Объекты являются ссылочными типами, поэтому по умолчанию они всегда передаются по ссылке. Любая объектная переменная является ссылкой на объект.
Но если вы передадите объектную переменную "по ссылке" (в параметр var), то, если вы замените объект другим объектом внутри процедуры, в которую вы его передали, вы будете в конце концов с другим объектом, как только возвращается процедура. Будьте осторожны при этом; это может привести к утечке памяти, если вы измените единственную ссылку, которую вы имеете на определенный объект.
Объекты передаются по ссылке.