- 類的特性
- 抽象、封裝、繼承、多態、重載
- class 和 struct 區別
- C中struct僅僅能夠包含數據成員,不能夠有成員函數,屬於複雜數據結構。
- C++ 中struct成員訪問權限默認爲public;繼承方式默認public;另外class能夠用在模板的聲明。template <class/typename T>
- 構造函數的初始化列表
- 順序和成員聲明順序一致。
- 必須應用的場景:初始化const、引用;調用父類的非默認構造函數。B(int x,int y):A(x)
-
class A { public: A(int k) : j(k), i(j) // i first. j follow { // code here } private: int i; int j; }
靜態數據成員和全局變量的區別:html
- 名稱空間不一樣,避免衝突。
- 支持信息封裝,屬於成員變量,能夠設置爲private。
- 注意:靜態很是量數據成員在類外初始化,靜態常量數據成員在類內初始化或類外初始化。非靜態常量必須在初始化列表。非靜態很是量在初始化列表或構造函數。
- 空類的成員函數
- 默認構造函數和複製構造函數
- 析構函數(不能夠被重載,不帶參數)
- 賦值函數(=)
- 取值運算(&)
- explicit 修飾的構造函數
- 只一個參數(其他爲默認參數)的構造函數支持隱式轉換。test(int i) { ... } ; test a = 1;
- explicit能夠關閉這種隱式轉換。僅能夠經過test a(1);
- 析構、構造函數與虛函數的關係
- 構造函數不能夠寫成虛函數,虛函數須要虛指針和虛表的支持,而這些是構造函數負責實現的。
- 析構函數須要寫成虛函數,能夠保證子類析構函數的正常調用。 Base* a = new Derived(); delete a;
- 複製構造函數
- 概念:特殊構造函數,根據同類其餘對象構建以及初始化新對象。
- 調用場景:按值傳遞,按值返回,使用對象進行初始化(test b; test a = b;)。
- 默認淺複製。深複製 vs 淺複製,當對象中引用了外部內容,若是新舊指向同一內容爲淺複製,不然爲深複製。
- 繼承類的處理:調用基類的複製構造函數。
- 與賦值函數的區別:1)複製是初始化對象,賦值是修改原有對象。2)複製是初始化,賦值首先檢查兩個對象是否一致,一致返回,不一致,釋放左值對象的內存並從新構建。
-
// 複製構造函數 A a; A b = a; //賦值函數 A a; A b; a = b; //賦值函數舉例 string& string::operator = (const string &other) { //檢查是否一致 if(this == &other) return *this; // 釋放內存 delete[] m_string; // 從新分配 m_string = new char[strlen(other.m_string) + 1]; strcpy(m_string, other.m_string); return *this; }
臨時對象數據結構
- 出現情景:參數按值傳遞,返回值按值傳遞。
-
C++函數重載函數
- 爲何可行:C++命名規則,包含參數個數和參數類型信息。
- 注意:返回值不一樣,const與否不足以區分函數。
- 重載和重寫的區別:1)重載不一樣版本的函數實現,方法名相同而參數列表不一樣【編譯時】。2)重寫是子類重寫父類的虛函數或抽象函數,相同的方法名和參數列表以及返回值【運行時】。
- 注意:隱藏(重定義):子類重定義父類的同名函數(參數列表能夠不一樣),隱藏父類同名函數。