下面是一个自己定义的类,代码很简单;
..........
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好象变的没什么意义了?

解决方案 »

  1.   

    这个类似于c++中的右类,delphi虽然没有右类的概念但是如果把两个类放到一个单元里就可以实现这样的功能,可能楼主没有注意你不单单可以访问他的public成员还可以访问他的private成员
      

  2.   

    如果不将一个对象实例化会导致实例对象不存在的错误而不是方法错误,方法在编译器就已经生成,所以随时都可以调用,如果访问一个未实例的对象的数据成员可能会导致内存读取错误,所以如果你不对对象的数据进行操作是没有什么问题的,如果调用的是虚方法和动态方法那么就要实例化你的对象因为delphi需要通过须方法表来访问这些。
      

  3.   

    to  hongqi162(失踪的月亮)  
     我还是有点不懂,ccc.destroy后,对象ccc应该不存在了啊!类的方法应该通过对象来访问,可对象没有被创建怎么能够使用对象来访问类方法呢?
      

  4.   

    to  hongqi162(失踪的月亮)  
      ccc:=nil和ccc.destroy在本质上有什么区别?
      我发现用ccc:=nil或是freeandnil(ccc)后就不能使用ccc来访问类方法了这是为什么呢?
    谢谢!
      

  5.   

    (1)Free和Destroy是不同的,自己不要去复写Free,TObject的Free的代码永远应该是:
    if Obj<>nil then
      Obj.Destroy
    (2)Destroy销毁对象,但是销毁完以后,你的对象引用并不是nil,而是指向一块不确定的内存,这个时候再使用该对象的行为是未定义的。良好的写法是:
    Obj.Free;
    Obj:=nil;
    当然,如果你的对象是一个全局变量,简单调用FreeAndNil(Obj)即可