本人初从C++转向delphi,在写程序时对对象及对象指针很迷糊,特意做了一些实验,以下是实验的感受及结论,请大家给些意见一.DELPHI没有栈对象,所有的对象都是在堆上,因此创建对象一定要记得销毁,不像C++局部对象可以栈上创建并且在函数结束时被自动析构
二.函数局部变量定义的类实际是一个地址,地址指向堆中的对象,调用create构造类时实际是create在堆中创建对象,把堆地址赋给对象,因此任何类对象在栈中只占4字节
三.指向类的指针类似于基本类型的指向指针的指针
四.New(p) p为指针,是在栈上创建一个p所指类型的变量,并且把指针赋值给p, 所以p 可以为指向基本类型或record类型的指针绝不能为指向class的指针,如果这样做了,只是会在栈上分配一段sizeof(class)大小的空间而已,是没法进行构造的根据以上经验感觉在TList等容器对象存类对象时应该存堆的地址,方法如下
l :TList;
obj1 :TTempClass;
存对象时
I.Add(Pointer(obj1));
取对象时
obj1 := TTempClass(I[n]);
二.函数局部变量定义的类实际是一个地址,地址指向堆中的对象,调用create构造类时实际是create在堆中创建对象,把堆地址赋给对象,因此任何类对象在栈中只占4字节
三.指向类的指针类似于基本类型的指向指针的指针
四.New(p) p为指针,是在栈上创建一个p所指类型的变量,并且把指针赋值给p, 所以p 可以为指向基本类型或record类型的指针绝不能为指向class的指针,如果这样做了,只是会在栈上分配一段sizeof(class)大小的空间而已,是没法进行构造的根据以上经验感觉在TList等容器对象存类对象时应该存堆的地址,方法如下
l :TList;
obj1 :TTempClass;
存对象时
I.Add(Pointer(obj1));
取对象时
obj1 := TTempClass(I[n]);
解决方案 »
- RzDBGrid使用问题,无法响应DrawDataCell事件
- 高分!!为IE加多窗口功能!
- 问一个代表性的问题:DELPHI中如何进行DIREX游戏开发?
- 关于图片的问题?
- 请教高手-类似xpmenu的自动功能是怎么实现的
- 问个菜鸟级的问题,我是在学校学DELPHI的,请问大家用的打包文件是用的什么?哪儿有免费的?常用的是什么?
- 自动调整列宽
- 那我能给出的最高分求教(不够可以再加):ADO编程中Master/Detail和继承的问题
- 怎么将TListView中的一个Column隐藏,并且拖也拖不出来?
- 如何编程实现在内部网上检测是否连上互联网?
- 200分求 inline api hook隐藏注册表启动项?
- DELPHI如何创建一个新的PANEL,这个PANEL跟原有的PANEL一样,包括里面的IMAGE控件和事件
有些程序设计基础在学新语言时很少会把本书重头到尾看到完 因为语言大同小异,只会有针对性的看
在真正工作中不会给你慢慢看书的时间
后面说的我看不太明白,指向对象的指针就是指向对象的指针,为何还类似于基本类型的指向指针的指针?例如
pszText : PChar;
Btn : TButton;
pszText是指向char的指针,而Btn是指向TButton的指针,这Btn如何类似于基本类型的指向指针的指针?在d中可以这么说,“对象名是指针”,所以也没有必要单独声明指向对象的指针,如果非要像你下面写的New(p)这样,p是个指向对象的指针,也应该是分配sizeof(Pointer)的空间而不是sizeof(class)。
record 指针 基本数据类型 被我归到基本类型了栈上不可能有 class对象 可以用他做为结论吗?
类对象是只存在堆里面的,
如果我们在函数中声明一个类的局部变量,他是存在栈里面的,
那么我们显示调用构造函数
obj := TTestClass.Create 完成了两个内容
一是在堆中构造出testclass对象,
二是将这个对象的地址存到栈上的局部变量中,这点难倒不和指针有些相似吗? 此时如果局部变量中再声明一个pobj :PTestClass
再令 pobj :=@obj;
此时我们可以看到pobj也在栈上,因为他是局部变量,他占用四个字节,内容是栈上obj的地址 obj也是4个字节 内容是堆上TTestClass对象的地址,这不像是指向指针的指针吗如果我们有两个函数,funcsave funcload 一个全局变量cap:TList
我想做的事是用funcsave创建10个对象 存入cap中,再调用funcload将caplist的内容取出来显示该如何做呢第一个问题TList中存的是Pointer 他该存什么,我的答案是应该存堆上object的地址,而不是pobj,因为pobj指向的是栈上的变量,是不可靠的
下一个问题这个地址如何表示呢,我的答案是Pointer(obj); 因此程序写法是
cap.add(Pointer(obj))
存储完成了该如何调用呢
obj2:=TTestClass(cap[n]);因此类对象的实体是存在堆中的内存块,这样看来类对象obj不像是一个指针吗,而pobj就是指向指针的指针
之所以不用New创建对象是因为
1)New只会简单的分配内存,不会调用初始化对象实例的方法.
2)而且Delphi的class类型也是指针,指向的是类的vmt.那么new创建class的实例则只能创建一个指针大小的内存.第一点就和C++不能用malloc分配创建对象一样.