X
xbl
Unregistered / Unconfirmed
GUEST, unregistred user!
请先看下面的测试:
Type
TExample = class
private
FMessage: string;
public
constructor Create;
procedure ShowIt;
end;
constructor TExample.Create;
begin
inherited;
FMessage := 'Hello';
end;
procedure TExample.ShowIt;
begin
ShowMessage('I''m TExample');
end;
测试 1:
procedure TForm1.Button7Click(Sender: TObject);
var
obj: TExample;
begin
obj.ShowIt
// I'm TExample
end;
问题:
1. 对象还没有创建,为什么不报错?
2. 如果 ShowIt 方法是 ShowMessage(FMessage),则报错?
//测试 2:
procedure TForm1.Button1Click(Sender: TObject);
var
obj: TExample;
P1, P2, P3, P4: Pointer;
begin
obj := TExample.Create;
P1 := Pointer(Integer(TExample) - 76);
TExample(P1).ShowIt
//I'm Example
P2 := TExample;
TExample(@P2).ShowIt
//I'm Example
P3 := Pointer(Integer(obj) - 76);
TExample(P3).ShowIt
//I'm Example
P4 := Pointer(Integer(TExample) + TObject.InstanceSize);
TExample(P4).ShowIt
//I'm Example
ShowMessage(Format('%d', [Integer(P1) - 76]))
//4570620
ShowMessage(Format('%d', [Integer(@P2)]))
//1243000
ShowMessage(Format('%d', [Integer(P3)]))
//13395420
ShowMessage(Format('%d', [Integer(P4)]))
//450776
obj.Free;
end;
问题:1. 为什么 P1,P2,P3,P4 所指向的地址不同,但是却调用了同一个函数 ShowIt()?
多运行几次,P1,P2,P3,P4 所指的地址也会发生变化?
2. 这 4 个指针所指向的地址是什么意思?
3. 类的实例的地址,类的地址(TExample),类的地址的地址(@TExample)
他们3者之间有什么联系?
//测试 3:
1) 将 TExample.ShowIt 改为:
procedure TExample.ShowIt;
begin
ShowMessage(FMessage);
end;
2) 测试:
procedure TForm1.Button2Click(Sender: TObject);
var
obj: TExample;
P1, P2, P3, P4: Pointer;
begin
obj := TExample.Create;
P1 := Pointer(Integer(TExample) - 76);
TExample(P1).ShowIt
//显示的是一些空格''
P2 := TExample;
TExample(@P2).ShowIt
//??
P3 := Pointer(Integer(obj) - 76);
TExample(P3).ShowIt
//显示的是一些空格''
P4 := Pointer(Integer(TExample) + TObject.InstanceSize);
TExample(P4).ShowIt
//出错: Access violation at address 0040453C in
// module 'Project2.exe'. Read of address 107FFFFC.
ShowMessage(Format('%d', [Integer(P1) - 76]))
//4570620
ShowMessage(Format('%d', [Integer(@P2)]))
//1243000
ShowMessage(Format('%d', [Integer(P3)]))
//13395420
ShowMessage(Format('%d', [Integer(P4)]))
//450776
obj.Free;
end;
问题:同测试 2
Type
TExample = class
private
FMessage: string;
public
constructor Create;
procedure ShowIt;
end;
constructor TExample.Create;
begin
inherited;
FMessage := 'Hello';
end;
procedure TExample.ShowIt;
begin
ShowMessage('I''m TExample');
end;
测试 1:
procedure TForm1.Button7Click(Sender: TObject);
var
obj: TExample;
begin
obj.ShowIt
// I'm TExample
end;
问题:
1. 对象还没有创建,为什么不报错?
2. 如果 ShowIt 方法是 ShowMessage(FMessage),则报错?
//测试 2:
procedure TForm1.Button1Click(Sender: TObject);
var
obj: TExample;
P1, P2, P3, P4: Pointer;
begin
obj := TExample.Create;
P1 := Pointer(Integer(TExample) - 76);
TExample(P1).ShowIt
//I'm Example
P2 := TExample;
TExample(@P2).ShowIt
//I'm Example
P3 := Pointer(Integer(obj) - 76);
TExample(P3).ShowIt
//I'm Example
P4 := Pointer(Integer(TExample) + TObject.InstanceSize);
TExample(P4).ShowIt
//I'm Example
ShowMessage(Format('%d', [Integer(P1) - 76]))
//4570620
ShowMessage(Format('%d', [Integer(@P2)]))
//1243000
ShowMessage(Format('%d', [Integer(P3)]))
//13395420
ShowMessage(Format('%d', [Integer(P4)]))
//450776
obj.Free;
end;
问题:1. 为什么 P1,P2,P3,P4 所指向的地址不同,但是却调用了同一个函数 ShowIt()?
多运行几次,P1,P2,P3,P4 所指的地址也会发生变化?
2. 这 4 个指针所指向的地址是什么意思?
3. 类的实例的地址,类的地址(TExample),类的地址的地址(@TExample)
他们3者之间有什么联系?
//测试 3:
1) 将 TExample.ShowIt 改为:
procedure TExample.ShowIt;
begin
ShowMessage(FMessage);
end;
2) 测试:
procedure TForm1.Button2Click(Sender: TObject);
var
obj: TExample;
P1, P2, P3, P4: Pointer;
begin
obj := TExample.Create;
P1 := Pointer(Integer(TExample) - 76);
TExample(P1).ShowIt
//显示的是一些空格''
P2 := TExample;
TExample(@P2).ShowIt
//??
P3 := Pointer(Integer(obj) - 76);
TExample(P3).ShowIt
//显示的是一些空格''
P4 := Pointer(Integer(TExample) + TObject.InstanceSize);
TExample(P4).ShowIt
//出错: Access violation at address 0040453C in
// module 'Project2.exe'. Read of address 107FFFFC.
ShowMessage(Format('%d', [Integer(P1) - 76]))
//4570620
ShowMessage(Format('%d', [Integer(@P2)]))
//1243000
ShowMessage(Format('%d', [Integer(P3)]))
//13395420
ShowMessage(Format('%d', [Integer(P4)]))
//450776
obj.Free;
end;
问题:同测试 2