運算子過載
使用運算子過載的目的使使用者自定義的型別像內建型別一樣用運算子進行相應的操作,定義過載運算子與普通函式類似,函式名由關鍵字operator和要定義的運算子組成,返回型別為運算結果的型別,參數列為提供參與運算的運算元,引數個數取決於運算元函式即是一元運算子還是二元運算子,運算子是成員函式還是非成員函式, 對於非成員函式通常宣告為類的友元,運算子函式只有在類型別的物件參與運算時才起作用。
可以過載的運算子:一元運算子,算數運算子,關係運算子,邏輯運算子,位運算子,賦值運算子,其他運算子。但是對於運算子過載不可濫用,只有在類需要的操作在邏輯上與運算子相關,才可以定義,並且對於邏輯與,或,逗號運算子都是不建議過載的運算子。
常用運算子的過載:
一元運算子:
例如自增和自減運算子,字首和字尾形式都會改變物件,不能對常量物件操作,字首形式返回改變後的物件,字尾形式返回改變之前的值,字尾形式的自增和自減比字首形式多乙個int引數,這個引數在函式中並不使用,只是作為過載函式的標記來區分字首和字尾運算,過載自增和自減運算子時應同時定義字首和字尾形式。
過載輸入輸出運算子:
「>>
」和「<<
」可以用於內建型別資料的
i/o流輸入和輸出,如果希望使用者自定義型別以這種方式輸入和輸出,就需要過載「
>>
」和「<<
」,過載輸入輸出運算子原型:istream& operator>>(istream&,type&); ostream& operator<<(ostream&,const type&)。
除這些外常用運算子過載還有過載二元運算子,過載賦值運算子,下標運算子等。
組合與繼承
組合:將乙個類的物件作為另乙個類的成員,被稱作組合或包含,成員物件是組合物件的一部分,隨著組合物件的建立而建立,隨著組合物件的撤銷而撤銷,物件成員初始化:
建立包含物件成員的組合物件時,會執行成員類的建構函式初始化物件成員,
當組合物件被撤銷時,會執行其析構函式,成員物件的析構函式也會被執行,
析構函式的執行次序和建構函式相反。
繼承:在已有類的基礎上繼承得到新型別,這個新型別自動擁有已有類的特性,並可以修改繼承到的特性或者增加自己的新特性 ,在c++中,被繼承的已有類稱為基類;繼承得到的新類稱為派生類;派生類可以再被繼承,這樣構成的層次結構稱為繼承層次。
繼承語法:
class 派生類名字 :[訪問限定符] 基類名字 ;
訪問控制 表示派生類對基類的繼承方式,使用關鍵字:
public 公有繼承
private 私有繼承
protected 保護繼承
但不論以哪種方式繼承基類,派生類都不能直接使用基類的私有成員 。
派生類的生成過程經歷了三個步驟:
1 吸收基類成員(全部吸收(構造、析構除外),但不一定可見)
2 改造基類成員
3 新增派生類新成員
基類初始化:在建立派生類物件時用指定引數呼叫基類的建構函式來初始化派生類繼承基類的資料
派生類建構函式:派生類::派生類名(引數總表):基類名(參數列)
多繼承:乙個類有多個直接基類的繼承關係稱為多繼承
多繼承宣告語法
class 派生類名 : 訪問控制 基類名1 , 訪問控制 基類名2 , … , 訪問控制 基類名n
資料成員和成員函式宣告
賦值相容規則:賦值相容規則指在程式中需要使用基類物件的任何地方,都可以用公有派生類的物件來替代。
賦值相容規則中所指的替代包括以下的情況: a
派生類的物件可以賦給基類物件 b
派生類的物件可以初始化基類的引用 c
派生類的物件的位址可以賦給基類型別的指標
虛函式與多型
多型性是指乙個名字,多種語義;或介面相同,多種實現。
過載函式是多型性的一種簡單形式。
虛函式允許函式呼叫與函式體的聯絡在執行時才進行,稱為動態聯編。
多型實現的前提就是虛函式,函式的一般形式為:virtual 函式返回值型別 虛函式名(形參表)
虛函式必須是類的非靜態成員函式(且非建構函式),且訪問許可權是public。並且非類的成員函式不能定義為虛函式,類的成員函式中靜態成員函式和建構函式也不能定義為函式,但可以將析構函式定義為虛函式。
在派生類中過載基類的虛函式要求函式名、返回型別、引數個數、
引數型別和順序完全相同,
如果僅僅返回型別不同,
c++認為是錯誤過載,
如果函式原型不同,僅函式名相同,丟失虛特性。
純虛函式(一種特殊的虛函式):純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」。
乙個具有純虛函式的類稱為抽象類。抽象類物件不能做函式引數,不能建立物件,不能作為函式返回型別;可以宣告抽象類指標,可以宣告抽象類的引用;子類必須繼承父類的純虛函式才能建立物件。
繼承與派生 運算子的過載 虛函式的應用
定義了乙個person類,派生出乙個student類,通過person的乙個指標來呼叫student類中定義成虛函式的show函式,過載了運算子 比較兩個學生的成績,先比較總分,總分相同比較數學,過載流插入運算子,用來輸出成績較高的同學的各科成績 include include using name...
虛函式與多繼承
問題 假設有兩個基類a和b,它們有乙個相同簽名的虛函式void foo 但是擁有不同的實現。現在要求建立乙個新類c,它同時繼承a和b,也有相同的簽名的函式void foo 並能分別對a和b中的foo函式進行重寫 overwrite 已知條件對應的 如下 include using namespace...
多繼承與虛函式
include using namespace std enum color class animal virtual int getage virtual void setage int age private int itsage animal animal int age itsage age...