首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 語言基礎核心知識點總結(面試必備)

     編輯:關於C++

C++ 語言基礎核心知識點總結

本文匯總 C++ 面試高頻考點,涵蓋類與對象、構造/析構/拷貝/賦值、const 語義、靜態成員、繼承與多態、模板、STL 容器分類等,適合快速複習與查漏補缺。

1. C 與 C++ 核心差異

  • C:面向過程;C++:面向對象(封裝、繼承、多態)。

2. 類與對象

  • 類是類型,對象是實例(如:學生是類,張三是對象)。
  • 類由成員變量(屬性)與成員函數(行為)構成。

3. 構造函數

  • 作用:創建對象時初始化。
  • 特點:同類名、無返回值、可重載、可帶參數、可定義在類內/外。
  • 若未聲明,編譯器生成預設構造函數(不初始化成員);一旦用戶聲明任一構造函數,編譯器不再生成預設版本。
  • 全缺省構造函數(所有參數有默認值)與無參構造函數二擇一,否則調用產生歧義。
  • 構造函數無 this 指針(對象尚未構造完成)。

初始化列表 vs 函數體賦值

  • 優先使用初始化列表:效率高(避免默認構造+賦值兩步),且必須用於:const 成員、引用成員、無預設構造函數的類類型成員。

4. 析構函數

  • 作用:釋放對象持有的資源(記憶體、句柄等)。
  • 名稱:~ClassName(),無參、無返回值、有 this 指針、不可重載、一個類只能有一個。
  • 若類含裸指針管理動態記憶體,必須顯式聲明析構函數並 delete,否則記憶體洩漏。
  • 對象生命週期結束自動調用;後構造先析構。

5. 拷貝構造函數

  • 簽名:ClassName(const ClassName&)(必須為引用,否則無限遞歸)。
  • 調用時機:
    1. 用現有對象初始化新對象(T t2(t1); 或 T t2 = t1;);
    2. 值傳遞參數給函數;
    3. 函數值返回對象。
  • 預設版本執行淺拷貝(逐位複製),導致指針成員指向同一塊記憶體,析構時雙重釋放崩潰。
  • 解決:實現深拷貝——分配新記憶體並複製內容。

6. 賦值運算符重載

  • 場景:兩個已存在對象之間賦值(t2 = t1;),不同於拷貝構造(新對象)。
  • 預設版本同為淺拷貝,需手動實現深拷貝。
  • 標準五步法:
    1. 檢查自賦值(if (this == &rhs) return *this;);
    2. 釋放舊資源(delete[] ptr;);
    3. 分配新資源;
    4. 複製內容;
    5. 返回 *this 支援鏈式賦值。

7. const 成員函數

  • 宣告:void func() const; —— 函數體內不可修改非 mutable 成員。
  • 常對象(const T obj;)只能調用 const 成員函數(構造/析構除外)。
  • 常用於 get、print 等唯讀操作,提升程式健壯性。

8. 靜態成員

項目靜態數據成員靜態成員函數
儲存位置全域/靜態存儲區,全類共享一份代碼區,屬於類不屬於對象
初始化類外定義並初始化:int Class::var = 0;類內聲明 static,類外定義無需 static
存取方式Class::var 或 obj.varClass::func() 或 obj.func()
可訪問—僅能訪問靜態成員(無 this 指針)

9. 繼承與多態

繼承基礎

  • 子類繼承父類所有成員(構造/析構/賦值運算符除外)。
  • 子類成員 = 繼承成員 + 自身擴展成員。

三種繼承方式

方式父類 public →父類 protected →父類 private →
publicpublicprotected不可訪問
protectedprotectedprotected不可訪問
privateprivateprivate不可訪問

虛函數與動態綁定

  • virtual 關鍵字聲明虛函數;構造函數、靜態成員函數、內聯函數不能為虛函數。
  • 父類指針/引用指向子類對象,調用虛函數時發生動態綁定(運行期根據對象真實類型決定調用版本)。
  • 虛函數表機制:對象含 vptr 指向類的 vtable,表中存虛函數地址。

純虛函數與抽象類

  • 純虛函數:virtual void func() = 0;(僅聲明無定義)。
  • 含純虛函數的類為抽象類,不可實例化;子類必須實現所有純虛函數,否則仍為抽象類。
  • 作用:定義介面規範,父類聲明介面,子類具體實現。

虛析構函數必要性

若父類析構非虛,delete 父類指針(實指子類對象)僅調用父類析構,子類資源洩漏。凡有虛函數,析構必須虛。

多重繼承與菱形繼承

  • 問題:同名成員二義性、菱形繼承產生兩份基類副本。
  • 解決:虛繼承(class B : virtual public A),孫子類構造函數直接調用虛基類構造函數,確保只有一份虛基類副本。

10. 類型轉換

  • static_cast:編譯期靜態轉型,不檢查運行期類型,轉型不保證安全。
  • dynamic_cast:運行期動態轉型(需 RTTI),轉型失敗返回 nullptr(指針)或拋出異常(引用),安全。

11. STL 容器分類速查

分類容器存取方式底層結構
順序容器vector隨機存取(下標)動態數組
deque隨機存取分段連續數組
list順序存取雙向鏈表
關聯容器set/multiset按鍵值存取紅黑樹
map/multimap按 Key 存取紅黑樹
容器適配器stack僅棧頂deque
queue僅隊頭/隊尾deque
priority_queue僅最高優先級vector (堆)

核心差異:順序容器按插入位置存儲,關聯容器按鍵值排序;順序容器通過位置存取,關聯容器通過鍵存取。

12. 空類編譯器默認生成的成員函數

空類會隱式獲得:預設構造函數、拷貝構造函數、析構函數、賦值運算符重載、取址運算符重載(const 與非 const 版本)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved