比如:
type
tmyclass = class
procedure aaa;
end;
...
procedure TForm1.FormCreate(Sender: TObject);
var myclass:tmyclass;
begin
myclass.aaa; //这里并没有 myclass:=tmyclass.create(),但也可以用?
//不过会提示 myclass 没有初始化?
end;
但是:
implementation
myclass:tmyclass
如果定义一个全局的 myclass:tmyclass 就不会出现提示 myclass 没有初始化?
创建实例是什么意思(原理)?
到底何时要创建实例(XXX.create)?
为什么在局部定义的 myclass:tmyclass 会出现未初始化,而全局的就不会?
请大家详细说说,或提供相关资料,谢谢!
FigoZhu(谢慕安) 于 2005-3-1 14:16:48类
rrhrrhf(过路的) 于 2005-3-1 19:40:18累?
rrhrrhf(过路的) 于 2005-3-2 21:00:20二楼是想说创建类的实例吧
这我知道啊
可为什么要创建实例,什么时候创建实例,创建实例除了初始化还有些什么?
cybercake(数字蛋糕) 于 2005-3-2 22:21:37理论上说,在不创建实例的情况下使用类成员都会出错。就算调用方法暂时行得通,往后处理数据的时候是一定不行的。所以没有必要讨论这种要不要创建实例的问题。
定义变量的时候(myclass:tmyclass)产生的只是一个指针(什么是指针不用我解释了吧)。你可以把某一个实例赋给它(引用),也可以调用TMyClass.Create创建一个实例。
singun(singun) 于 2005-3-2 22:32:57类只是一个模子,如何要使用它所描述的功能,必须将其实例化。但是在没有创建其实例时,类本身也可以包含一些方法供调用,这就是类方法,此方法须带clase 关健字。
类实例化的原理是这样:
定义一类,实际上只是定义了一个指针,这个指针变量存储在系统堆栈区。在没有实例化前,它所指向的数据成员、方法(类方法除外),实际上并不存在.在实例化后,会在堆内开辟相应的内存存储类的数据成员、方法。实例化的方法并不一定就是create,可以自己定义.
rrhrrhf(过路的) 于 2005-3-3 8:32:52多谢楼上两位的解说
那为什么在局部定义的 myclass:tmyclass 会出现未初始化,而全局的就不会?
这是为什么?
caiso(十年磨一剑) 于 2005-3-4 10:38:13顶一下
chijingde(AD) 于 2005-3-4 10:43:52那是编译器的警告
变量也是如此
var
a:integer;
var
i:integer;
begin
a:=i;
end;
会提示i没有被初始化
a不会提示是因为全局变量自动初始化,数字为0,指针为空
但是局部变量则不会
aus(天兵) 于 2005-3-4 18:18:28顶
rrhrrhf(过路的) 于 2005-3-4 19:15:43正如楼上的楼上所说,我懂了,多谢!!!
楼上的楼上,你能再讲讲关于创建实例更多的东西吗