定义的类如下:type
  TMydata = class
    private
    protected
 
    public      Function Getdata (const Filename   : String):Tstringlist;  end;implementation
   Function TMydata.Getdata(const Filename : String):Tstringlist; 
   begin
     Result:=Tstringlist.Create;
     Result.LoadFromFile( ExtractFilePath(Application.ExeName) + Filename);
   end;
end.
调用如下:
procedure TForm1.Button1Click(Sender: TObject);var:
  mydata:TMydata;
  mystrlist:Tstringlist;
begin   //mydata:=TMydata.create;   //去掉这句,下面的mydata.Getdata使用也正常
   mystrlist:=mydata.Getdata('test.txt');     Label1.Caption := mystrlist[0];
   Label2.Caption := mystrlist[1];
   Label3.Caption := mystrlist[2];     mystrlist.free;
     mydata.free
 
end;为什么只是声明了mydata:TMydata; 后面没有Create,mydata的Getdata方法也可以正常使用啊?
(我知道,Getdata方法如果有操作其实类成员的语句会出错,没create,所以没分配内存,这正常)
但是,不是例的实例被创建后才可以使用吗?

解决方案 »

  1.   

    你工程dpr 文件中已经创建了mydata不然不可能让你用
      

  2.   

    类是会被加载到内存中的,即使没有类对象的声明和创建,所以类的成员函数在内存中是实际存在的,比如VMT之类的虚拟函数表,
    但类成员变量则只有在类对象实例化之后才会分配内存,
    这样解释的话,你的情况就能说的通了。
      

  3.   

    但是如果没有mydata:=TMydata.create;
    Getdata方法里,使用类的其它字段的语句会报错,去掉使用其它字段的语句就正常了加上mydata:=TMydata.create;的话,两种情况都正常mydata 应该没有正常创建
      

  4.   

    你的代码相当于function Getdata(Self: TMydata; const FileName: string): TStringList;调用的时候第一个参数是个无效的参数,但是不涉及有关于它的任何引用,当然也就不会出错了