天天看點

類對象和類指針差別

淺談類對象和類指針

本文轉自。。。

Student a;

s.setName(“A”);

//Studeng *b = new Student();

Student *b;

b = new Student();

b->setName(“B”);

分析:

定義類對象基本格式是:Student a;在定義之後就已經為a這個對象配置設定了記憶體,且為記憶體棧;

定義類指針基本格式是:Student b = new Student();在定義b的時候并沒有配置設定記憶體,隻有執行new後才會配置設定記憶體,且為記憶體堆。

問題:

(1)類對象和類指針差別

A: 定義

——類對象:利用類的構造函數(構造函數:對類進行初始化工作)在記憶體中配置設定一塊區域(包括一些成員變量指派);

——類指針:是一個記憶體位址值,指向記憶體中存放的類對象(包括一些成員變量指派;類指針可以指向多個不同的對象,這就是多态);

B: 使用

——引用成員:對象使用“.”操作符,指針用“->”操作符;

——生命周期:若是成員變量,則由類的析構函數來釋放空間;若是函數中臨時變量,則作用域是函數體内;而指針則需要利用delete在相應的地方釋放配置設定的記憶體塊。

注意:new與delete成對存在!!!

C: 存儲位置

——類對象:用的是記憶體棧,是個局部的臨時變量;

——類指針:用的是記憶體堆,是個永久變量,除非你釋放它。

D: 多态

——指針可以實作多态,直接用對象不行。

F: 通路方式

——指針變量是間接通路,但可實作多态(通過父類指針可調用子類對象),并且沒有調用構造函數;

——直接聲明可直接通路,但不能實作多态,聲明即調用了構造函數(已配置設定了記憶體)。

(2)類對象和類指針聯系

——在類的聲明尚未完成的情況下,可以聲明指向該類的指針,但是不可聲明該類的對象;

——父類的指針可以指向子類的對象。

(3)指針與多态

——有前面可知:類指針是一個指向記憶體中存放類對象的記憶體位址值,那麼這個指針可以指向多個不同的對象,這就是多态;

拓展:指針與虛函數

——要發揮虛函數的強大作用,必須使用指針來通路對象。

——當類是有虛函數的基類,Func是它的一個虛函數,則調用Func時:

類對象:調用的是它自己的Func;

類指針:調用的是配置設定給它空間時那種類的Func。

繼續閱讀