在Delphi中按值传递的函数(过程)是这样定义的:
procedure fillsomething (Xvalue : integer)
按值传递是无法改变实参的值的。
按地址传递的函数(过程)是这样[定义的:
procdeure fillsomething (Var Xvalue : integer)
按地址传递是可以改变实参的值的。
可是由于Delphi中向系统申请一个变量和向系统申请一个类实例是有点不同的,会造成要对类进行按值或按地址传递时有误解。
Delphi中声明一个类TMyclass后,要创建它的实例是这样的:
声明一个类:
Tmyclass = class
public
myint;
end;
下面开始创建这个类的实例:
1。Myclass1 : Tmyclass; //注意,这一步中,只是得到了一个Tmyclass的指针。
2。Myclass1 := Tmyclass.create; //创建实例,并把Mycalss1指向这个实例。
而在Delphi中声明一个变量时,直接声明就是已经是一个实例了。如:
i : integer; //声明了一个名为i的整型变量
str : strings; //声明了一个名为str的字符串变量。
由于声明变量与创建类的不同,导致了在过程(函数)调用的时候按值传递与按地址传递的问题。看下面代码:
(1)定义一个过程
procedure FillSomething (tmpint : integer; tmpmycalss : Tmycalss);
begin
tmpint := 100;
tmpmycalss.myint := 100;
end;
(2)调用这个过程:
x := 0;
tmpmycalss.myint := 0;
FillSomething(x,myclass1);
执行完这个函数后的结果是怎样呢?
X是个实例,是按值传递的,所以执行完FillSomething后,x的值还是零。在FillSomething的定义中,myclass1看上去是按值,但因为myclass1指针,其实按地址传递,所以所以FillSomething执行完后myclass1中myint的值被修改成100了。
这是Delphi与C++的不同之处:
C++中,mycalss1 : Tmyclass是创建了一个Tmyclass的实例,要得到这个实例的指针就用&mycalss1。
Delphi中,mycalss1: Tmyclass是创建了一个TMyclass的指针,还要用create创建一个实例,并把指针指向这个实例。所以在Delphi中,用了create创建一个实例,用完之后一定要记得free,不然就有可能产生内存泄漏。