C++語法細微(四)(運算符重載/繼承派生)

運算符重載的方法:
函數類型 operator 運算符名稱(形參表列)
{對運算符的重載處理}
函數operator+重載了運算符+
C++不允許用戶自己定義新的運算符 只能對已有的C++運算符進行重載
只有5個運算符不能被重載
(.)(成員訪問運算符),
(.*)(成員指針訪問運算符),
(::)(域運算符),
(sizeof)(長度運算符),
(?:)(條件運算符)
重載不能改變運算符對象(即操作數)的個數
重載不能改變運算符的優先等級
重載不能改變運算符的結合性
重載運算符的函數不能有默認的參數
重載的運算符必須和用戶定義的自定義類型的對象一起使用 其參數至少應該是一個類對象(或類對象的引用)
對於類對象的運算符一般必須重載 但是有兩個例外 (=)(&)
應當使重載的運算符的功能類似於該運算符作用於標準類型數據時所實現的功能
運算符重載函數可以是類的成員函數 也可以是友元函數 還可以是既非類的成員函數和友元函數的普通函數

先搭框架 逐步擴充 由簡到繁 最後完善 邊編程 邊調試 邊擴充

istream &operator >> (istream&,自定義類&);
ostream &operator << (ostream&,自定義類&);
只能將重載<< AND >>的函數作爲友元函數或者普通函數 而不能將他們定義爲成員函數

隱式類型轉換 顯式類型轉換
提倡的標準寫法 類型名(數據)

轉換構造函數(conversion constructor function)將一個其他類型的數據轉換成一個類的對象
類名(指定類型的數據)
類型轉換函數(type conversion function)的作用是將一個類的對象轉換成另一種類型的數據
operator 類型名()
{實現轉換的語句}
在函數名前面不能制定函數類型 函數沒有參數

在已經定義了相應的轉換構造函數的情況下 將運算符"+" 重在爲友元函數在驚醒兩個複述相加時 可以用交換律。
如果將運算符+函數重載爲類的成員函數時 交換律不適用 於是 將雙目運算符重載爲友元函數 單目運算符重載爲成員函數

類型轉換函數和 運算符重載以及轉換構造函數相矛盾

繼承(inheritance)和派生
BaseClass FatherClass DerivedClass SonClass
Multiple Inheritance
派生類是基類的具體化 基類是派生類的抽象
class DerivedClassName : [inheritMethod] BaseClassName
{Derived Class Implement};
保護派生類(protected derived class)

在執行派生來的構造函數是 調用基類的構造函數是一個繼承裏面用到的好的方法
派生類構造函數名(總參數表列):基類構造函數名(參數表列)
{派生類中新增數據成員初始化語句}

執行派生類構造函數的順序:
調用基類構造函數 對基類的數據成員初始化
調用子對象構造函數 對子對象數據成員初始化
再執行派生類構造函數 對派生類數據成員初始化

在執行派生來的析構函數的時候 系統會自動調用基類的析構函數和子對象的析構函數
先執行派生類自己的析構函數 對派生類新增加的成員進行清理 然後調用子對象的析構函數
對子對象進行清理 最後調用基類的析構函數 對基類進行清理。

多重繼承:
class D : public A, protected B, private C
{類D增加的成員};

派生類的構造函數名(總參數列表):基類1構造函數(參數表列),基類2構造函數(參數表列),基類3構造函數(參數表列)
{派生類中構造函數體}
先調用基類的構造函數,調用順序是按照聲明派生類時基類出現的順序
多重繼承會產生二義性,需要加類名來限制說明具體是哪個成員

虛基類:
虛基類聲明並不是在生命基類時聲明的而是在聲明派生類時 指定繼承方式時聲明的。
class 派生類名:vritual 繼承方式 基類名
最終派生類在構造函數初始化的時候需要調用虛基類的構造函數 ,並且直接派生虛基類的派生類不會再調用

在一個類中以另一個類的對象作爲數據成員稱爲類的組合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章