1.內聯成員函數
1)隱式聲明:將成員函數直接定義在類的內部 2)顯式聲明:inline標示
2)在類中,使用inline定義內聯函數時,必須將類的聲明和內聯成員函數的定義都放在同一個文件中,否則編譯時無法進行代碼置換。
2.同類對象賦值
1)對象賦值語句進行對象賦值時,兩個對象的類型必須相同
2)數據成員占存儲空間,成員函數占相同的函數代碼段
3)類中存在指針時,使用默認賦值運算函數賦值,可能錯誤
3.構造函數
1)跟普通成員函數一樣,當構造函數直接定義在類中時,作為內聯函數處理
2)一般聲明為公有成員,但不能顯式調用,定義對象時自動調用,且只執行一次
4.成員初始化列表
1)C++中,引用類型和const修飾的成員不允許在構造函數中用賦值語句直接賦值
2)類成員按照在類中被聲明的順序初始化,與在初始化列表中列出的順序無關
5.析構函數
1)析構函數沒有參數、返回值,且不能重載
2)撤銷對象時,編譯系統自動調用析構函數
6.默認構造函數
1)當一個類定義了一個構造函數,系統不再提供默認構造函數
7.重載構造函數
1)一個類中,當無參數的構造函數和帶默認參數的構造函數重載時,可能產生二義性
8.拷貝構造函數
1)拷貝構造函數只有一個參數,並且是同類對象的引用
2)每個類都有一個拷貝構造函數
3)調用拷貝構造函數三種情況:(1)當用類的一個對象去初始化該類的另一個對象時(2)當函數形參是類的對象(3)當函數的返回值是對象
9.淺拷貝和深拷貝
1)默認的拷貝構造函數是淺拷貝。有指針類型時,只是讓指針指向同一塊內存,沒有申請新的內存
2)默認的拷貝構造函數處理帶指針類型數據時,當調用析構函數時可能出現錯誤
10.靜態數據成員
1)靜態數據成員初始化應在定義對象之前,類外單獨進行。一般在main()之前、類聲明之后。如:int Student::count = 0
2)靜態數據成員屬於類
3)靜態數據成員跟靜態變量一樣,在編譯時創建並初始化
11.靜態成員函數
1)靜態成員函數的作用是為了處理靜態數據成員。如確實需要,靜態成員函數只能通過對象名訪問該對象的非靜態成員
2)靜態成員函數與非靜態成員函數的重要區別是:非靜態成員函數有this指針,靜態成員函數沒有this指針
3)私有靜態成員函數不能被類外部的函數和對象訪問
4)靜態成員函數可以在建立任何對象之前調用,以處理靜態數據成員
5)編譯系統將靜態成員函數限定為內部連接
6)靜態成員函數是類的一部分,而不是對象的一部分,可以用類名::或對象調用共有靜態成員函數
12.非成員函數聲明為友元函數
1)友元函數既可以是不屬於任何類的非成員函數,也可以是另一個類的成員函數
2)因為友元函數不是類的成員,所以不能直接訪問對象的數據成員,也不能通過this指針訪問對象的數據成員,必須通過作為入口參數傳遞進來的對象名 (指針、引用)來訪問該對象的數據成員
3)友元函數提供了不同類的成員函數之間、類的成員函數與一般函數之間進行數據共享的機制
13.成員函數聲明為友元函數,稱為友元成員函數
1)一個類的成員函數作為另一個類的友元函數時,必須先定義這個類
2)提前引用聲明
14.友元類
1)當一個類被說明為另一個類的友元類時,它所有的成員函數都成為另一個類的友元函數
2)友元關系沒有交換性和傳遞性
15.類的組合
1)當調用構造函數時,按各對象成員在類聲明中的順序依次調用他們的構造函數,再執行類的構造函數體
2)調用順序跟在初始化列表中的順序無關。析構函數跟構造函數順序相反。
16.常引用與常對象
1)常引用往往用來作為函數的形參,這樣的參數稱為常參數。
2)C++不允許更改常對象的數據成員,C++不允許常對象調用普通的成員函數
17.常對象成員
1)類中說明的常數據成員,構造函數只能通過初始化列表對它初始化
2)常成員函數在聲明函數和定義函數時都要有關鍵字const
3)關鍵字const可以被用於對重載函數區分
4)常成員函數可以訪問常數據成員,也可以訪問普通數據成員,但都不能改變
5)普通成員函數可以訪問和改變普通數據成員,可以訪問常數據成員但不能改變
6)常對象只能調用它的常成員函數,常成員函數是常對象唯一對外接口
7)常成員函數不能更新對象的數據成員,也不能調用該類普通成員函數
18.基類成員在派生類中的訪問屬性
1)派生類可以繼承基類中除了構造函數與析構函數之外的成員
2)基類中的私有成員無論哪種繼承,在派生類中都不可直接訪問
3)其他在派生類中的訪問屬性為基類中的訪問屬性與繼承方式中較低公開性的那個
19.派生類構造和析構函數的調用順序
1)當創建派生類對象時,先調用基類的構造函數,隨后調用派生類構造函數
2)當含有子對象時,先調用基類構造函數,然后調用子對象構造函數,最后調用派生類構造函數體,撤銷對象時,析構跟構造函數順序相反
3)如果派生類的基類也是一個派生類,每個派生類只負責其直接基類的數據成員初始化
20.同名成員
1)在沒有虛函數時,如果在派生類中定義與基類成員同名的成員,則稱派生類成員覆蓋了基類的同名成員,在派生類中使用該成員意味着訪問重新聲明的成 員。用::可以訪問到基類的同名成員。
21.訪問聲明
1)訪問聲明可個別調整基類的某些成員在派生類中的訪問屬性,使在派生類中保持原來的訪問屬性
2)訪問聲明只能是基類名::成員名的形式,不可帶類型和參數,如:A::disp,A::a
3)訪問聲明不能改變成員在基類中的訪問屬性,對基類的私有成員不能使用訪問聲明
4)對於基類中的重載函數名,訪問聲明對基類所有同名函數起作用
22.多繼承
1)多繼承中的構造函數的調用順序與初始化列表中的順序無關,只與聲明繼承方式時順序有關
23.虛基類
1)為了解決多繼承中的二義性
2)如果在虛基類中定義有帶形參的構造函數,並且沒有定義默認形式的構造函數,則整個繼承結構中,所有直接或間接的派生類都必須在構造函數成員初始 化列表中列出對虛基類構造函數的調用
3)建立一個對象時,如果這個對象中含有從虛基類繼承來的成員,則虛基類的成員是由最遠派生類的構造函數通過調用虛基類的構造函數進行初始化的,該 派生類的其他基類對虛基類構造函數的調用都自動被忽略。
4)同一層次中同時包含虛基類和非虛基類,應先調用虛基類的構造函數,再調用非虛基類的構造函數,最后調用派生類構造函數。
5)對於多個虛基類,構造函數的執行順序仍然是先左后右,自上而下。
6)對於非虛基類,構造函數的執行順序仍是先左后右,自上而下。
7)若虛基類由非虛基類派生而來,則仍然先調用基類構造函數,再調用派生類的構造函數。
24.賦值兼容
1)共有派生類是基類真正的子類,它完整地繼承了基類的功能。要求公有派生。
2)在基類的對象可以使用的地方,都可以用派生類的對象來替代,但只能使用從基類繼承來的成員
3)派生類對象可以賦值給基類對象
4)派生類對象可以初始化基類對象的引用
5)派生類對象的地址可以賦給指向基類對象的指針
6)如果函數的形參是基類對象或基類對象的引用,在調用函數時可以用派生類對象作為實參
25.多態性
1)C++中,編譯時多態性主要通過函數重載和運算符重載實現,運行時多態性主要是通過虛函數實現的
2)C++規定:基類的對象指針可以指向它公有派生的對象,但是當其指向公有派生類對象時,它只能訪問派生類從基類繼承來的成員,不能訪問公有派生類 中定義的成員
3)虛函數是基類中的成員函數,加上關鍵字virtual,並在派生類中被重載
4)最好在對派生類的虛函數進行重新定義時也加上關鍵字virtual
5)一個虛函數無論被公有繼承多少次,它仍然保持其虛函數的特性
6)虛函數必須是其所在類的成員函數,而不能是友元函數,也不能是靜態成員函數,因為虛函數調用要靠特定的對象來決定激活哪個函數
7)內聯函數不能是虛函數,因為內聯函數是不能在運行中動態確定其位置的。即使虛函數在類的內部定義,編譯時仍將其看作是非內聯的
8)構造函數不能是虛函數,但是析構函數可以是虛函數,並且通常說明為虛函數
9)雖然派生類的析構函數與基類的析構函數名字不相同,但是如果將基類的析構函數定義為虛函數,由該基類所派生的所有派生類的析構函數也都自動成為 虛函數
10)在派生類中重新定義虛函數時,如果僅僅返回類型不同,其余均相同,系統會給出錯誤信息;若僅僅函數名相同,而參數的個數、類型或順序不同,系 統將它作為普通的函數重載,丟失虛函數特性
26.純虛函數
1)考慮到派生類的需要,在基類中預留一個函數名,具體功能由派生類定義
27.抽象類
1)如果一個類至少有一個純虛函數,那么這個類稱為抽象類
2)抽象類只能作為其他類的基類使用,不能建立對象
3)不能從具體類中派生出抽象類
4)抽象類不能作為函數的參數類型、函數返回類型、顯示轉換的類型
5)可以聲明指向抽象類的指針或引用
6)如果派生類中沒有定義純虛函數的實現,而派生類只是繼承基類的純虛函數,則這個派生類仍然是一個抽象類
28.函數模板
1)在函數模板中允許使用多哥類型參數
2)在template語句與函數模板定義語句之間不允許插入別的語句
3)同一般函數一樣,函數模板也可以重載
4)函數模板與同名的非模板函數可以重載。調用順序是首先找一個參數完全匹配的非模板函數,找到就調用,否則尋找函數模板,將其實例化,產生模板函 數
29.類模板
1)在類模板外定義成員函數時,若成員函數中有類型參數存在,則a.需要在成員函數定義前進行模板聲明 b.在成員函數名前加上“類名<類型參數>::”
2)每個類模板定義之前,都需要在前面加上模板聲明template <typename Type>,使用類模板時,必須在類模板名字后面加上<類型參數> Stack<Type>
3)模板類可以有多個類型參數