淺談類對象和類指針

代碼:函數

    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個字節。若是用對象,參數   傳遞佔用的資源就太大了

相關文章
相關標籤/搜索