读书人

一个很基础的语法有关问题?请大家给解

发布时间: 2012-02-26 20:19:44 作者: rapoo

一个很基础的语法问题?请大家给解释一下!
下面是一个自己定义的类,代码很简单;
..........
Tmy_object=class(TObject)
private
FValue: Integer;
public
constructor Create(Avalue:integer);
destructor Destroy; override;
function showstring:string;
end;
..................
constructor Tmy_object.Create(AValue: Integer);
begin
inherited Create;
FValue := AValue;
end;

destructor Tmy_object.Destroy;
begin
Form1.Memo1.Lines.Add( 'my_object.Destroy ');
inherited Destroy;
end;

function Tmy_object.showstring: string;
begin
Result := 'The integer is: ' + IntToStr(FValue);
end;


//点击button事件
procedure TForm1.Button1Click(Sender: TObject);
var
ccc:Tmy_object;
begin
memo1.Lines.Clear;
Form1.Memo1.Lines.Add(ccc.showstring);
end;
问题:
1.我在点击button后在memo1中出现 'The integer is:-685053757 ',我不明白我并没有用Tmy_object创建ccc的实列啊!
为什么能够访问showstring呢?

2.如改为: begin
memo1.Lines.Clear;
ccc:=Tmy_object.Create(5);
ccc.Destroy;//ccc.free;好象free和destroy是一样的;
Form1.Memo1.Lines.Add(ccc.showstring);
end;
我在点击button后在memo1中出现 'my_object.Destroy
The integer is:5 ',
我已经销毁了ccc怎么还会可以使用,destroy和free好象变的没什么意义了?



[解决办法]
这个类似于c++中的右类,delphi虽然没有右类的概念但是如果把两个类放到一个单元里就可以实现这样的功能,可能楼主没有注意你不单单可以访问他的public成员还可以访问他的private成员
[解决办法]
如果不将一个对象实例化会导致实例对象不存在的错误而不是方法错误,方法在编译器就已经生成,所以随时都可以调用,如果访问一个未实例的对象的数据成员可能会导致内存读取错误,所以如果你不对对象的数据进行操作是没有什么问题的,如果调用的是虚方法和动态方法那么就要实例化你的对象因为delphi需要通过须方法表来访问这些。
[解决办法]
(1)Free和Destroy是不同的,自己不要去复写Free,TObject的Free的代码永远应该是:
if Obj <> nil then
Obj.Destroy
(2)Destroy销毁对象,但是销毁完以后,你的对象引用并不是nil,而是指向一块不确定的内存,这个时候再使用该对象的行为是未定义的。良好的写法是:
Obj.Free;
Obj:=nil;
当然,如果你的对象是一个全局变量,简单调用FreeAndNil(Obj)即可

读书人网 >.NET

热点推荐