Delphi中创建类的实例与定义一个变量引出的问题

来源:互联网 发布:linux grep 模糊 编辑:程序博客网 时间:2024/04/30 23:56

在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,不然就有可能产生内存泄漏。

原创粉丝点击