淺談類對象和類指針
本文轉自。。。
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。