C 語法細微 四 運算子過載 繼承派生

2021-05-12 15:43:01 字數 2057 閱讀 5190

運算子過載的方法:

函式型別 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

;保護派生類(protected derived class)

在執行派生來的建構函式是 呼叫基類的建構函式是乙個繼承裡面用到的好的方法

派生類建構函式名(總參數列列):基類建構函式名(參數列列)

執行派生類建構函式的順序:

呼叫基類建構函式 對基類的資料成員初始化

呼叫子物件建構函式 對子物件資料成員初始化

再執行派生類建構函式 對派生類資料成員初始化

在執行派生來的析構函式的時候 系統會自動呼叫基類的析構函式和子物件的析構函式

先執行派生類自己的析構函式 對派生類新增加的成員進行清理 然後呼叫子物件的析構函式

對子物件進行清理 最後呼叫基類的析構函式 對基類進行清理。

多重繼承:

class d : public a, protected b, private c

;派生類的建構函式名(總引數列表):基類1建構函式(參數列列),基類2建構函式(參數列列),基類3建構函式(參數列列)

先呼叫基類的建構函式,呼叫順序是按照宣告派生類時基類出現的順序

多重繼承會產生二義性,需要加類名來限制說明具體是哪個成員

虛基類:

虛基類宣告並不是在生命基類時宣告的而是在宣告派生類時 指定繼承方式時宣告的。

class 派生類名:vritual 繼承方式 基類名

最終派生類在建構函式初始化的時候需要呼叫虛基類的建構函式 ,並且直接派生虛基類的派生類不會再呼叫

在乙個類中以另乙個類的物件作為資料成員稱為類的組合。

C 運算子過載(四)

c 允許在自己的類中,或是在全域性作用域中重定義運算子的含義。由於很多物件導向的語言沒有提供這種能力,因此你可能會低估這種特性在c 中的作用。c 中運算子的概念十分廣泛,甚至包含 陣列索引 函式呼叫 型別轉換以及記憶體分配和釋放例程。可以通過運算子過載來改變語言運算子對自定義類的行為。能讓自己的類具...

C 的運算子過載(四) 其他運算子過載和總結

概述 除了前面過載的指標,自增自減,左移運算子之外,可以發生過載的運算子還有很多,比如等號 等等 以及 等,二 符號過載總結 三,字串類封裝 class person person int age1,char name1 person operator person p person int age...

C 運算子過載 過載特殊運算子

賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...