U
ufo
Unregistered / Unconfirmed
GUEST, unregistred user!
如果楼主明白类创建时做了些什么,就不会迷惑了。
类创建时,会分配内存,初始化对象内含的数据,创建VMT(虚拟方法表)等。
而类内的函数过程,在编译器编译单元文件时内存地址就已经确定了,因此你没有创建这个类的实例,也可调用他,比如,var st: Tstringlist;
st:= Tstringlist.create
你就在Tstringlist没有创建实例前调用了其 create方法。
而如果st在没执行上面的create语句之前,任何操作都是错误的,比如下面的错误语句
st.create;虽然编译可以通过,但不能正常执行。
这里的st只是一个“类变量”而不是类。没初始化时,它指向的是无效的或未知的内存地址。
类创建时,会分配内存,初始化对象内含的数据,创建VMT(虚拟方法表)等。
而类内的函数过程,在编译器编译单元文件时内存地址就已经确定了,因此你没有创建这个类的实例,也可调用他,比如,var st: Tstringlist;
st:= Tstringlist.create
你就在Tstringlist没有创建实例前调用了其 create方法。
而如果st在没执行上面的create语句之前,任何操作都是错误的,比如下面的错误语句
st.create;虽然编译可以通过,但不能正常执行。
这里的st只是一个“类变量”而不是类。没初始化时,它指向的是无效的或未知的内存地址。