C/C++程序基礎 (六)面向對象

  1. 類的特性
    • 抽象、封裝繼承多態、重載
  2. class 和 struct 區別
    • C中struct僅僅能夠包含數據成員,不能夠有成員函數,屬於複雜數據結構。
    • C++ 中struct成員訪問權限默認爲public;繼承方式默認public;另外class能夠用在模板的聲明。template <class/typename T>
  3. 構造函數的初始化列表
    • 順序和成員聲明順序一致
    • 必須應用的場景:初始化const、引用;調用父類的非默認構造函數。B(int x,int y):A(x)
  4. class A { public: A(int k) : j(k), i(j) // i first. j follow
     { // code here
     } privateint i; int j; }

     靜態數據成員和全局變量的區別:html

    • 名稱空間不一樣,避免衝突。
    • 支持信息封裝,屬於成員變量,能夠設置爲private。
    • 注意靜態很是量數據成員在類外初始化,靜態常量數據成員在類內初始化或類外初始化。非靜態常量必須在初始化列表。非靜態很是量在初始化列表或構造函數。
  5. 空類的成員函數
    • 默認構造函數和複製構造函數
    • 析構函數(不能夠被重載,不帶參數)
    • 賦值函數(=)
    • 取值運算(&)
  6. explicit 修飾的構造函數
    • 只一個參數(其他爲默認參數)的構造函數支持隱式轉換。test(int i) { ... } ;  test a = 1;
    • explicit能夠關閉這種隱式轉換。僅能夠經過test a(1);
  7. 析構、構造函數與虛函數的關係
    • 構造函數不能夠寫成虛函數,虛函數須要虛指針和虛表的支持,而這些是構造函數負責實現的。
    • 析構函數須要寫成虛函數,能夠保證子類析構函數的正常調用。 Base* a = new Derived(); delete a;
  8. 複製構造函數
    • 概念:特殊構造函數,根據同類其餘對象構建以及初始化新對象。
    • 調用場景:按值傳遞,按值返回,使用對象進行初始化(test b; test a = b;)。
    • 默認淺複製。深複製 vs 淺複製,當對象中引用了外部內容,若是新舊指向同一內容爲淺複製,不然爲深複製。
    • 繼承類的處理:調用基類的複製構造函數。
    • 與賦值函數的區別:1)複製是初始化對象,賦值是修改原有對象。2)複製是初始化,賦值首先檢查兩個對象是否一致,一致返回,不一致,釋放左值對象的內存並從新構建。
  9. // 複製構造函數
    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; }

     臨時對象數據結構

    • 出現情景:參數按值傳遞,返回值按值傳遞。
  10.  C++函數重載函數

    • 爲何可行:C++命名規則,包含參數個數和參數類型信息。
    • 注意:返回值不一樣,const與否不足以區分函數。 
    • 重載和重寫的區別:1)重載不一樣版本的函數實現,方法名相同而參數列表不一樣【編譯時】。2)重寫是子類重寫父類的虛函數或抽象函數,相同的方法名和參數列表以及返回值【運行時】。
    • 注意:隱藏(重定義):子類重定義父類的同名函數(參數列表能夠不一樣),隱藏父類同名函數。
相關文章
相關標籤/搜索