Delphi的record,有的人可能理解它是没有方法的类,可是这样的理解只是从表面上去理解的,其实二者存在巨大的区别。指针
下面只是讲解Delphi的class与record,暂时尚未去钻研C++的类和结构体的差别。code
给一个代码解释一下对象
type PPerson = ^Person; //定义一个record的指针类型 Person = record //定义一个record name: string; age: Integer; end; TPerson = class //定义一个类 public name: string; age: Integer; end;
上面定义了一个record 和一个class ,看起来有点像,可是其本质上有不少的区别。继承
就像上面的那个类应该是最简单的类了,看上去没有这个类没有方法,可是这个类默认是继承自TObject的。内存
虽然没有显式的声明方法,可是是它是有Create、Destroy、Free等大量继承自TObject的方法的。string
见下面的声明的变量class
var PersonRecord: Person; //一个record声明的变量 PPersonRecord: PPerson; //一个record指针类型声明的变量 TPersonClass: TPerson; //一个类变量
第一个是经过一个record类型声明的一个变量,这个变量是一个record类型,可是不是指针。变量
第二个是经过一个record指针类型声明的变量,这个变量是一个record类型的指针,若是使用New或者赋值一个存在的record的地址,那么将会指向一个record实体。原理
第三个是经过一个类声明的一个变量,可是这个类变量就至关于一个指针,具体的使用、原理请参见本文前面的部分讲解。sso
因此下面的关于record的代码
begin PersonRecord.name:= 'xumenger'; PersonRecord.age:= 22; //这样是对的,由于在使用record类型声明一个变量的时候就已经在内存的栈为其分配了内存空间了 end;
下面是关于record指针类型变量的代码
begin //PPersonRecord.name:= 'xumenger' //PPersonRecord.age:= 22; //上面的两行是错误的,由于PPerssonRecord是一个record类型的指针, //在声明这个变量的时候,只是在内存中分配了存储指针的空间,并无分配存储record的空间 //因此要下面这样,先为record申请空间 New(PPersonRecord); PPersonRecord.name:= 'xumenger'; //或者PPersonRecord^.name:= 'xumenger'; PPersonRecord.age:= 22; //或者PPersonRecord^.age:= 22; end;
注意使用New 为Record指针分配了一个记录类型的空间,并使指针指向该内存中的record实体,在使用完成以后,不要忘记了使用Dispose去释放申请的内存空间。
再看类的代码
begin //TPersonClass.name:= 'xumenger'; //TPersonClass.age:= 22; //上面的两行是错误的,由于使用类声明的变量至关于一个指针,因此也只是在内存中分配了存储其指针的空间 //因此要下面这样,先构造一个对象,也就是在内存中分配空间 //注意要和record的指针类型区别 TPersonClass:= TPerson.Create; //虽说它也是指针可是不能使用New(TPersonClass); TPersonClass.name:= 'xumenger'; //不能使用TPersonClass^.name:= 'xumenger'; TPersonClass.age:= 22; //不能使用TPersonClass^.age:= 22;
注意对于类,构造了类对象的实体以后,必定不要忘记在使用完对象以后去释放对象。