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;
注意對於類,構造了類對象的實體以後,必定不要忘記在使用完對象以後去釋放對象。