把CLASS转成整数后的问题。有人注意过没有。:)(200分)

  • 主题发起人 主题发起人 bkbk
  • 开始时间 开始时间
B

bkbk

Unregistered / Unconfirmed
GUEST, unregistred user!
假设A是个CLASS,那么:
integer(a)
得到的数值是什么数值? 不要告诉我“是A转成整数后的数值”这样的废话。
我留意了一下,如果两个CLASS是同一类型,使用integer(a)得到的数值好象是同一个值,但是
如果在把它转回成CLASS的时候,编译器又好象能自动的识别这个整数是属于哪个CLASS的。所以
有点迷惑了:
在发生转换的时候,到底发生了什么事情?
有人知道吗?
 
这个整数应该是指向这个类VMT的地址的指针。
我的测试代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i := Integer(TForm1);
ShowMessage(IntToStr(i));
ShowMessage(TFormClass(Pointer(i)).ClassName);
with TFormClass(i).Create(Self) do
begin
Caption := 'Haha';
try
ShowModal;
finally
Free;
end;
end;
end;
 
实例地址拉,一切对象皆指针嘛:)
 
a:longint;
a:=longint(edit1);
tedit(a).text:='aaa'
就是指针一样的道理
 
和指针明显是不同的。你们DEBUG程序没有?转出来的值和地址值明显不是一个值[:D]
 
“一切对象皆指针”真是总结得好,
类也是指针,函数也是,数组一样。除了哪些叫做傎类型的不是。
 
to bkbk: 指针的地址和指针指向的内容当然不同了:)
对象变量是一个指针,“转出来的值”是指针指向的内容,而它的“地址”即指针的地址
指针的地址有意义吗?当然不能和指针的内容相提并论。
我的意思是这个指针指向实例,而你却理解为指针的地址,岂不是把指针当作实例?
而事实上指针是指向实例。明白了?(像绕口令:))
 
beta:
所以我才问你DEBUG过没有嘛。[:D]
“转出来的值”是指针指向的内容
按照DEBUG的结果,“转出来的值”根本不是指针的值,也就是说
假设:
i: pointer;
J: pchar;
i := j;
那么:
i^ <> integer(j)
同时:
@j <> integer(j)

BETA后面那堆话我确实看不懂在说什么,比绕口令还绕口令。桂电的语文水平确实不错。[:D]
而且:
一切对象皆指针,这种说法是片面的。在DELPHI里,可以这么说。在C++里,包括(C++ BUILDER),
对象就是对象,和指针没有必然的联系。很多人以为BCB里的对象也都是指针,这种理解只能说明他
是“把BCB当DELPHI来用”,没有理解C++。[:D]
 
按照我BKBK的理解:
一切数值类型,不管他是指针、CLASS、结构等等。在计算机里都是“0101”之类的整数表达
形式。因此一切类型都可以用整形来表示。
integer(pointer)
得到的值,只是这个POINTER的在计算机中的整数形式。[:)]
这个性质很有用途,比如“在COM里,如何传递一个Recordset出来”。这个问题就可以用这种
方式来解决。[:D]
唯一让我没搞明白的是,假设有两个同类型的POINTER,那么他们的integer后的值是相同的,那么
当再次被转回成原来的POINTER,是否会出错?我DEBUG的结果是没有出错,但我不知道计算机是怎么识别
的,到底发生了什么事。
嘿嘿,这个小问题我看可以拉倒一大片人。[8D]
 
X86指令集是过程式,按地址访问的。所以所有值都是通过地址取得,无论是C++,
pascal,还是动态语言。
如果有一天出了个面向对象指令集,面向对象文件系统(MS在做,做了M年了),
哪就另外说了.
 
我觉得TFormClass(Pointer(i)).ClassName应该可以看得出编译器是如何识别的了。
 
后退
顶部