c++primer plus閱讀筆記(六)

c++自動提供的成員函數

默認構造函數,如果沒有定義構造函數
默認析構函數,如果沒有定義
拷貝構造函數。如果沒有定義
賦值運算符,如果沒有定義
地址運算符,如果沒有定義。

什麼時候調用拷貝構造函數

Time time_ob_2(time_ob_1);
Time time_ob_2 = time_ob_1;
Time time_ob_2 = Time(time_ob_1);
Time *time_ob_2 = new Time(time_ob_1);

其中要特別注意第二種並非是重載了等號運算符,在聲明類的時使用等號賦值方法會被編譯器直接優化成第一種方式,試驗中所有都被優化成第一種形式。

c++11空指針

char * str=nullptr;//c++11 null pointer notation

直接調用構造函數

直接調用構造函數會產生一個臨時對象,生命期爲當前語句。

繼承構造順序

首先創建基類對象,調用基類的構造函數;
析構的時候與構造相反,先調用派生類的析構函數,然後自動調用積累的析構函數。

派生類和基類

基類指針和引用都可以不通過顯示類型轉換指向派生類,但是隻能調用基類的方法。
但是派生類的指針和引用無法隱式轉換到基類,因爲轉化成功後,該指針無法調用派生類的成員。

虛函數

雖然基類的指針(引用)對派生類的兼容性,但無法調用派生類的成員,如:
Cycle a;
Motocycle b;
cycle *ptr=&b;
b->fn();        //use Cycle::fn();

---------------------------------------------------------
如果將fn()定義成虛函數
class Cycle{
...
virtual void fn();
...
}

b->fn();        //use Motocycle::fn()

---------------------------------------------------------
1.只要基類聲明某個函數,子孫類中類型完全相同的函數也爲虛函數(也可以顯示聲明)。

虛函數表

1.編譯器爲每一個對象添加一個隱藏成員,隱藏成員保存了一個指向當前對象的虛函數地址數組的指針
2.執行的時候通過判斷當前指針所指向的對象的類型從而決定使用哪個虛函數表。

虛函數注意事項

1.派生類不繼承,所以講構造函數聲明爲虛沒有意義,構造函數不能夠是虛擬函數

2.析構函數應當是虛函數,因爲
Father *ptr=new Son;
...
delete ptr;

3.虛函數是從當前指針(引用)對象開始找fn(),如果找不到則會向上(基類)尋找。

4.派生類通過參數對函數(虛函數)進行重載後,會將基類同名函數隱藏,但是這對於兼容性的基類指針(引用)來說沒有影響,因爲虛函數表和執行方式沒有發生改變。
class Father{
...
void fn();
...
};

class Son{
...
void fn(int a);
...
};

Father fa;
fa.fn();            //invalid

Father *ptr=new Son;
ptr->fn();          //valid

純虛函數

虛函數原型後面加上"=0"表示純虛函數,作用是提供接口給派生類實現,有純虛函數的爲抽象類,不能實例化
virtual void fn()=0;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章