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,不然就有可能产生内存泄漏。
- Delphi中创建类的实例与定义一个变量引出的问题
- 创建一个类的实例,修改类中定义为private的变量的值
- 由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用
- 从一个String类引出的问题
- PhotoCamera引出的一个问题
- 一个PATH引出的问题
- 由Struct 嵌套定义引出的问题
- 类变量、成员变量、实例变量、局部变量、静态变量、全局变量的定义与区别
- 一个在构造函数中定义变量的问题
- Delphi类里面的方法和类型定义不影响创建实例的大小
- 从const_cast引出的一个问题
- 有final引出的一个问题
- 一个C++小题目引出的问题
- 闭包引出的一个问题
- python中关于class类中一个实例变量的引用问题
- 变量的定义与使用问题
- strlen() 与 sizeof() 引出的问题
- Java 中类变量与实例变量的区别
- 数据挖掘建模之评估数据
- 自定义Flex Validator
- 设计模式读书笔记之状态模式(State Pattern)
- tonight
- AIR中的延迟呈现
- Delphi中创建类的实例与定义一个变量引出的问题
- 功能点(FP)估算法(一) 识别项目范围和数据复杂度
- Flex 4新书
- Delphi 出现Never-build package 'a' requires always-build package 'b'错误的解决
- 使用Flash Builder 4进行Unit Test
- Delphi 中initialization和finalization的作用
- VC++动态链接库(DLL)编程
- 递归数列(recursive sequence)
- DateTimeAxis高级应用