代碼:函數
Student a; s.setName("A"); //Studeng *b = new Student(); Student *b; b = new Student(); b->setName("B");
分析:spa
定義類對象基本格式是:Student a;在定義以後就已經爲a這個對象分配了內存,且爲內存棧;指針
定義類指針基本格式是:Student *b = new Student();在定義*b的時候並無分配內存,只有執行new後纔會分配內存,且爲內存堆。code
問題:對象
(1)類對象和類指針區別生命週期
A: 定義
內存
——類對象:利用類的構造函數(構造函數:對類進行初始化工做)在內存中分配一塊區域(包括一些成員變量賦值);資源
——類指針:是一個內存地址值,指向內存中存放的類對象(包括一些成員變量賦值;類指針能夠指向多個不一樣的對象,這就是多態);作用域
B: 使用class
——引用成員:對象使用「.」操做符,指針用「->」操做符;
——生命週期:如果成員變量,則由類的析構函數來釋放空間;如果函數中臨時變量,則做用域是函數體內;而指針則須要利用delete在相應的地方釋放分配的內存塊。
注意:new與delete成對存在!!!
C: 存儲位置
——類對象:用的是內存棧,是個局部的臨時變量;
——類指針:用的是內存堆,是個永久變量,除非你釋放它。
D: 多態
——指針能夠實現多態,直接用對象不行。
F: 訪問方式
——指針變量是間接訪問,但可實現多態(經過父類指針可調用子類對象),而且沒有調用構造函數;
——直接聲明可直接訪問,但不能實現多態,聲明即調用了構造函數(已分配了內存)。
(2)類對象和類指針聯繫
——在類的聲明還沒有完成的狀況下,能夠聲明指向該類的指針,可是不可聲明該類的對象;
——父類的指針能夠指向子類的對象。
(3)指針與多態
——有前面可知:類指針是一個指向內存中存放類對象的內存地址值,那麼這個指針能夠指向多個不一樣的對象,這就是多態;
拓展:指針與虛函數
——要發揮虛函數的強大做用,必須使用指針來訪問對象。
——當類是有虛函數的基類,Func是它的一個虛函數,則調用Func時:
類對象:調用的是它本身的Func;
類指針:調用的是分配給它空間時那種類的Func。
(4)什麼狀況使用類對象與類指針?
——其實做用基本同樣 都是爲了調用類的成員變量和成員函數用的;
——當你但願明確使用這個類的時候,最好使用對象;
若是你但願使用C++中的動態綁定,則最好使用指針或者引用,指針和引用用起來更靈活,容易實現多態等。
(5)指針好處——第一,實現多態。——第二,在函數調用,傳指針參數。無論你的對象或結構參數多麼龐大,你用指針,傳過去的就是4個字節。若是用對象,參數 傳遞佔用的資源就太大了。