從指針和內存角度區別Delphi的record、record類型的指針、類

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

區別二:類聲明的變量實際上是一個指針,可是record聲明的不是

見下面的聲明的變量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;

  注意對於類,構造了類對象的實體以後,必定不要忘記在使用完對象以後去釋放對象。

相關文章
相關標籤/搜索