Delphi中居然支持这样的语句,很奇怪,进来看看吧!

whyNotHere 2003-02-22 04:51:55
我是Delphi菜菜,少见多怪!大家帮我看看。

type
TForm1 = class(TForm)
private
Flag: Boolean;
public
constructor Create(AOwner: TComponent); override;
end;

var
Form1: TForm1;

implementation

constructor TForm1.Create(AOwner: TComponent);
begin
Flag := True;
inherited Create(Application);
end;

end.

Flag是TForm1的成员变量, 可是在TForm1.Create(AOwner: TComponent)函数中:
在 "TForm1实例化之前" 就对 "Flag进行了付值", 也就是说在为TForm1分配内存空间之前,Flag就已经有了内存空间. 是怎么回事? Delphi中的类和对象怎么区分?
...全文
28 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyNotHere 2003-02-22
  • 打赏
  • 举报
回复
C++没学好。。呵呵!
sysu 2003-02-22
  • 打赏
  • 举报
回复
嗯是这样的。

我觉得C++也是这样的啊。
whyNotHere 2003-02-22
  • 打赏
  • 举报
回复
也就是说在调用TFrom1.Create()函数之前就已经分配了空间。

eg: MyForm: TForm1; //在此就分配了空间,对吧?
TForm1.Create(Application);
westfly 2003-02-22
  • 打赏
  • 举报
回复
sysu(死树) 说得没错。
BlueTrees 2003-02-22
  • 打赏
  • 举报
回复
Flag := True;
inherited Create(Application);
通常,我们不这样写的,是这样写的
inherited Create(AOwner);
Flag := True;

form不一定用Application创建,所以Application的传递有问题。
类在创建的时候,已经为变量、方法分配了存储空间,否则Create的时候,Self隐含参数就没有意义了。
sysu 2003-02-22
  • 打赏
  • 举报
回复
Delphi里的构造函数也是自动调用的啊,只是先分配内存空间再调用的,
C++不也是么?
whyNotHere 2003-02-22
  • 打赏
  • 举报
回复
不会吧,先分配内存空间,然后才调用构造函数?C++里的构造函数是自动
调用的。Delphi的这种做法有点象是给一个类的成员变量付值,而不是一个
对象!我觉得。
sysu 2003-02-22
  • 打赏
  • 举报
回复
Delphi的面向对象机制跟其它是一样的,我记得C++里面也是可以这样的吧。
应该理解为:先为Form1分配了内存空间,然后才调用构造函数的。

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧