真心求教(100分)

  • 主题发起人 主题发起人 风雨燕归来
  • 开始时间 开始时间

风雨燕归来

Unregistered / Unconfirmed
GUEST, unregistred user!

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2184919

中想问几个问题(我知道我菜,但为什么没有人理我):
1、基本数据类型与类是如何区分的,有人认为基本数据类型也可能当成是类,在Delphi中基本数据类型不需要CREATE,而类却需要,不知道C++需要吗?而楼主好像也就是存在这个疑问,你俩吵了半天,大家还是不明白,当然,高手嘛。(我是说我很菜,可不是说在这的人都菜)
2、类或者对像在内存之中的存在形式是如何的,函数呢?我知道堆中数据可以自动分派,回收,而栈中却不行,delphi的变量、函数、还是对像,究竟是什么?一个变量和一个函数又是如何的标明是某个类的成员呢?变量和命令又是存储在同一块内存中吗?再就是一个类被实例化的时候,其基类是否也同时实例化了吗,若无,那它怎么能调用其超类的成员函数呢,若有,它被初始化成了什么?怎么引用它呢?是parent吗?若还想调用它的祖先类,又该如何?
3、再就是

showmessage是誰的靜態方法? 再說showmessage跟我們討論的根本無關,因為我們程序里調用的是a.ABC,這裡ABC定義成TMyClass的靜態方法了嗎?

这句有理,但a.ABC不是静态方法,showmessage究竟是谁的成员函数?a.ABC又为什么在实例化之前可调用了呢?什么?已经实例化了,那为什么其它类又不能了呢?
 
1.delphi中的对象相当于c++中的对象指针
2.类在内存中存在形式是VMT(虚方法表),对象在内存中的存在是一个特殊结构的record,这个record最初4个字节是指向相应VMT的指针
堆中数据的自动回收是在程序结束时由windows进行的,平时不会自动回收,栈中的数据是在过程/函数结束时就回收了。源代码级表明变量或函数是根据定义的地方。变量和命令(代码)一般不存在于同一块内存中,变量一般存在于堆或栈中,代码存在于被操作系统保护的代码段内。所谓类的实例化说白了就是在内存中分配实例所占用的那个record,父类的变量在结构的前面,继承类的变量依继承关系依次排列在结构中(注意:只有变量,所有虚方法都在VMT中,静态方法由编译器直接生成调用代码了,所以在结构或VMT中都不存在),因此如果你知道父类某个私有变量的位置,那么可以通过偏移量直接访问(不过oo可不推荐这么做)。
3.showmessage是普通过程,它和类方法的区别在于类方法被调用时会自动带进一个参数,这个参数就是对象实例的指针(即self)如果类方法声明中有两个参数,实际调用时传递进来的是3个参数,而普通过程/函数则是声明几个参数,调用时传递的就是几个参数。
a.abc是静态方法,它的调用由编译器在编译时就自动生成代码了,所以不需要实例化即可调用,但是由于没有实例化,所以它调用时自动传递进来self参数就是未知或者非法的,所以在a.abc中不能访问类中定义的变量(对类中的变量的访问生成的代码就是访问以self为基地址相对于类实例record中相应偏移量处的数据,如果self非法,当然后面的访问就会产生av错了)。
 
基本数据类型当然不是类
 
to Another_eYes 老师:
你好,你怎么知道a.abc是静态方法呢?
 
delphi中的对象相当于c++中的对象指针
=================================================
那C++中的所定义的对象的名称如:
如:class CMy123App : public CWinApp
CMy123App theApp;
那么此处的theApp作什么讲,是对象的引用还是指针?
=================================================
type
TMyClass=class
public
procedure ABC;
end;
.....
procedure TMyClass.ABC;
begin
Showmessage('OK');
end;
=========================================================================
再就是那个record结构是在create时生成的,VMT是什么时候载入内存的呢,是在程序的初始化之前吗,我使用一个object,是否要把它所有VMT都要载入,这又是怎么办的呢。
 
我顶,我就是要顶
我不懂,所以我要顶
 
看看刘艺老师的《delphi面向对象编程思想》
 
c++不熟悉,估计类变量是在你进入过程时由编译器生成代码在栈中帮你自动create,退出过程时自动回收的。
因此你的theApp就是对象实例,简单说它就是对象实例的首地址。

vmt不需要你自己管理(应该也不能由你自己管理),你可以把它当成编译器生成的机器码的一部分。
delphi类定义中没有virtual/dynamic/override指示字的都是静态方法。
 
对象不是指针,创建了对象实例后对象就在栈中占有了一定的空间,而对象的引用(相当于C++中的指针,它指向对象)则在堆中.
 
后退
顶部