C++ 知識點彙總(持續更新)

  • 1. 引用:
  • 引用作爲別名時,聲明時就必須初始化
  • 常用作函數得形參,使用引用即使用源數據,而不是其副本=\
  • 傳遞類對象參數得標準方式一般是按引用傳遞
  • 指針是變量,可重新賦值,但引用不行
  • 使用時必須初始化,且不能再指向其他變量

  • 2. 內聯函數

  • 3. 默認參數的函數

  • 函數中某個參數設置了默認值,則它右邊的參數也都要有默認值

  • 4. 函數重載

  • 5. extern "C 主要用於能夠正確實現 C++ 調用其他 C 語言代碼,加上 **extern "C"**之後,會指示編譯器這部分代碼按照 C 語言的進行編譯,而不是 C++ 的。

  • 6. 函數模板和類模板

  • 7. 構造函數

  • 構造函數的名稱和類名相同,通過函數重載,可以創建多個同名的構造函數。

  • 構造函數沒有聲明類型。初始化與構造函數的參數列表相匹配。

  • 如果不實現構造函數,編譯器會生成一個默認構造函數;如果自己實現,則編譯器不會生成。

  • 8. 析構函數

  • 系統默認的析構函數:如果構造函數沒有使用 new,只需編譯器生成一個什麼都不用做的析構函數即可。

  • 如果構造函數使用 new 來分配內存,則必須使用 delete 提供的析構函數釋放這些內存。

  • static 數據成員和成員函數

  • static 修飾類中成員,表示類的共享數據

  • static 成員變量不佔用對象的內存,而是在所有對象之外開闢內存,即使不創建對象也可以訪問。

  • 使用 static 成員變量必須在類外進行初始化。

  • 用 static 修飾的成員變量在對象中是不佔內存的,因爲他不是跟對象一起在堆或者棧中生成,用 static 修飾的變量在靜態存儲區生成的。

  • 由於 static 修飾的類成員屬於類,不屬於對象,因此 static 類成員函數是沒有 this 指針的(this 指針是指向本對象的指針)。正因爲沒有 this 指針,所以 static 類成員函數不能訪問非 static 的類成員,只能訪問 static 修飾的靜態類成員。

  • 普通成員函數可以通過對象名進行調用,而 static 成員函數必須通過類名進行調用(因爲它與類關聯)。

  • 9. 動態內存分配

  • new/delete是運算符(關鍵字),malloc/free是函數調用。

  • 10. 拷貝構造函數

  • 調用拷貝構造函數的時機:

  • 1.定義一個新對象並用一個同類型的對象進行初始化時

  • 2.對象作爲實參或函數返回對象時

  • 定義一個拷貝構造函數的固定形式:Student(const Student& s);

  • 11. 淺拷貝和深拷貝

  • 如果不定義拷貝構造函數,則編譯器會使用默認拷貝構造函數,是淺拷貝

  • 淺拷貝遇到含有指針的對象類型時很容易出問題,因爲淺拷貝出來的對象和原對象的指針都指向同一個內存空間,當其中一個對象被析構後,另一個對象再使用時就會發生內存溢出。

  • 深拷貝遇到指針時,會重新分配一塊空間,因此不會有問題。

  • 12. 什麼時候需要定義拷貝構造函數

  • 1.類數據成員有指針

  • 2.類數據成員管理資源(如打開一個文件)

  • 3.一個類需要析構函數釋放資源時,那它也需要一個拷貝構造函數

  • const 關鍵字

  • 初始化 const 成員變量的唯一方法是使用初始化列表(不能在構造函數的函數體中初始化)。

  • const 成員函數可以使用類中的所有成員變量,但是不能修改它們的值, 這種措施主要還是爲了保護數據而設置的。const 成員函數也稱爲常成員函數。

  • 常成員函數需要在聲明和定義的時候在函數頭部的結尾加上 const 關鍵字

  • 在 C++ 中,const 也可以用來修飾對象,稱爲常對象。一旦將對象定義爲常對象之後,就只能調用類的 const 成員(包括 const 成員變量和 const 成員函數)了。

  • 13. 運算符重載

  • 運算符重載可以選擇使用成員函數或非成員函數來實現。

  • 非成員函數應是友元函數,這樣纔可以直接訪問類的私有數據。

  • 運算符重載的限制

  • 1、爲防止用戶爲標準類型重載運算符,重載後的運算符必須至少有一個是用戶自 定義類型的數據。

  • 2、不能違反運算符原有的運算規則。

  • 3、不能重載不存在的運算符,即不能創建新的運算符

  • 4、以下運算符不可重載:

            sizeof :sizeof運算符
    
            . :成員運算符
    
            .* :成員指針運算符
    
            :: : 域解析運算符
    
            ? : 條件運算符
    
            typid : RTTI運算符
    
            const_cast、dynamic_cast、reinterpret_cast、static_cast  :強制類型轉換
    
  • 5、只能用作成員函數重載的運算符:

            = :賦值運算符
    
            () :函數調用運算符
    
            [] :下標(索引)運算符
    
            -> :通過指針訪問類成員的運算
    
  • C++ 的運算符重載可以作爲成員函數重載,也可以作爲非成員函數(友元)重載,兩者之間最重要的區別在於重載函數的參數列表的不同,作爲成員函數重載的時候會隱式的傳遞 this 指針,而作爲非成員函數進行重載的時候需要顯式傳遞。+ C++ 中 ++、-- 運算符的重載式很特別的存在,它們有獨特的格式,分爲前自增(自減)和後自增(自減)。爲了編譯器能夠進行區分,引入了一個額外的 int 進行區分,但這個 int 不含有實際意義

  • 13. 類之間的關係

  • is-a 繼承體現

  • has-a 組合體現

  • 繼承的意義

  • 代碼重用

  • 體現不同抽象層次

  • 公有繼承:`class Teacher: public Person

  • 子類只能訪問父類的public和protected成員,不能訪問private成員。

  • 在構造一個子類時,父類部分由父類的構造函數完成,子類的部分由子類的構造函數完成。

  • 構造一個子類時,先構造父類,然後構造子類,析構時相反。`

  • 多態:同樣的方法調用而執行不同操作、運行不同代碼。

  • 14. 虛函數與抽象類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章