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

C++ 易錯知識點總覽:建構/解構/複製控制、const、異常、繼承、模板與 STL 核心考點

     編輯:關於C++

本文匯整 C++ 核心語法中最易踩坑、面試高頻考察的知識點,採「分類→核心規則→代碼範例」結構,涵蓋物件生命週期、const 語意、異常處理、繼承與虛函數、模板機制、STL 容器/演算法/迭代器特性,作為查漏補缺速查手冊。

一、物件生命週期與複製控制

建構子

  • 無回傳型別、名稱同類別、可多載。
  • 成員初始化列表優先於 函數體執行,順序按宣告順序,而非列表順序。
  • 必須在列表初始化:const 成員、參考成員、無預設建構子的成員物件、基類建構子需參數時。

解構子

  • 名稱 ~ClassName(),無參數、無回傳、不可多載。
  • 物件生命週期結束自動呼叫 (區域變數離開作用域、delete 指標、容器銷毀)。
  • 基類解構子必須為 virtual,否則 delete base_ptr 僅呼叫基類解構子 → 派生類資源洩漏。
  • 解構順序:函數體 → 成員 (宣告逆序) → 基類 (繼承逆序) → 虛基類 (最尾端派生類負責,構造逆序)。

複製建構子

  • 簽名:ClassName(const ClassName&) (參數必須為引用,否則無限遞迴)。
  • 觸發場景:初始化、傳值參數、傳值回傳、容器插入/擴容。
  • 預設為淺複製 (逐位元/指標複製),含指標成員必須自訂深複製。

賦值運算子

  • 簽名:ClassName& operator=(const ClassName&),必為成員函數。
  • 核心三步驟:自我賦值檢查 → 釋放舊資源 → 深複製新資源 → return *this。
  • 與複製建構子成對出現 (三法則/五法則)。

組合類建構/解構順序

  1. 基類建構子 (繼承宣告順序)。
  2. 成員物件建構子 (宣告順序)。
  3. 自身建構子函數體。
  4. 解構完全相反。

二、const 全方位語意

形式語意關鍵規則
const Type obj常物件僅能呼叫 const 成員函數;必須初始化且不可修改
Type func() const常成員函數宣告/定義皆加 const;可區分多載;內部不可修改非 mutable 成員
const Type member常資料成員僅能在建構子初始化列表賦值
static const int靜態常量整型/枚舉可類內初始化,其餘類外定義
const Type& ref常參考可綁定暫時物件/字面值;不可透過它修改物件
Type* const ptr常指標指標本身不可改指向;可修改指向物件
const Type* ptr指向常量的指標不可透過它修改物件;指標可改指向

三、異常處理機制

  • throw 可拋任意型別;catch 按順序匹配,派生類 catch 必須在基類前。
  • catch(...) 捕獲所有,**必須置最後**。
  • 堆疊解旋:try 進入到 throw 期間建構且未解構的區域物件,**自動按逆序解構**。
  • 異常規格 (C++11 棄用,C++20 移除):void f() throw(int, double) 限制拋出型別;違規觸發 std::unexpected (預設終止)。現代用 noexcept。
  • throw; 在 catch 中重拋**原始異常物件** (非副本)。

四、繼承與多態核心陷阱

繼承方式與存取轉換

繼承基類 public基類 protected基類 private
publicpublicprotected不可存取
protectedprotectedprotected不可存取
private (預設)privateprivate不可存取

名稱隱藏

  • 派生類宣告同名函數,**隱藏基類所有同名多載版本** (而非覆寫)。
  • 需 using Base::func; 或 Base::func() 顯式存取。

虛基類

  • 解決菱形繼承資料重複:class B1: virtual public Base。
  • 虛基類建構子由最尾端派生類直接呼叫,中繼類列表調用被忽略。

動態多態三要件

  1. 基類有 virtual 函數。
  2. 派生類覆寫 (同名、同參、同回傳、同 cv/ref 資格,協變除外)。
  3. 透過基類指標/參考呼叫。

直接用物件呼叫虛函數 = 靜態綁定。

純虛函數與抽象類

  • virtual void f() = 0; 宣告純虛函數;含純虛函數類別為抽象類,**不可實例化**。
  • 基類可提供純虛函數定義,**派生類仍須覆寫**才能實例化。
  • 純虛解構子必須提供定義 (派生類解構鏈會呼叫)。

五、模板機制

  • 函數模板:template<typename T> T max(T a, T b);定義必須置於頭檔 (編譯期實例化)。
  • 類模板:template<typename T> class Vector;使用時 Vector<int> v。
  • 模板參數:型別參數 (typename/class)、非型別參數 (整數常量)、模板模板參數。
  • 特化:全特化 template<> class Vector<bool>、偏特化 template<typename T> class Vector<T*>。

六、STL 容器/演算法/迭代器精華

迭代器失效規則

  • vector/string/deque:插入/刪除/擴容 → **所有迭代器失效**;reserve 可避免擴容失效。
  • list/forward_list:僅被刪除元素的迭代器失效,其餘穩定。
  • map/set 族:僅被刪除元素的迭代器失效。

關聯容器鍵的 const 性

  • map::iterator 解參考得 pair<const Key, Value>,**鍵不可修改**。
  • 不可用 sort/random_shuffle 等需修改元素順序的演算法。

演算法與迭代器類別匹配

  • sort 需隨機存取迭代器 → vector/deque/array/指標。
  • reverse 需雙向迭代器 → list/map/set。
  • list 專屬 sort/merge/splice/unique 修改節點連結而非元素值,效能優異。

插入迭代器

  • back_inserter (push_back)、front_inserter (push_front、反序)、inserter (insert at pos)。

七、記憶體管理與指標

  • new Type(val) / new Type[sz] → 必配 delete ptr / delete[] ptr。
  • new Type (無括號) vs new Type() (有括號):POD 型別前者不初始化、後者零初始化;非 POD 兩者同呼叫預設建構子。
  • 智慧指標 (unique_ptr, shared_ptr, weak_ptr) 取代裸指標管理所有權。

八、其他高頻細節

  • gets() 已棄用 (緩衝區溢位),用 fgets() 或 std::getline。
  • cin >> x 遇空白停止;getline 讀整行,前有 cin 需先 cin.ignore() 清除換行。
  • inline 僅建議,編譯器可忽略;類內定義隱式 inline。
  • 結構體 struct 預設 public、支援繼承/多態;聯合體 union 共用記憶體、不支援繳承/虛函數/非 POD 成員。
  • 位欄位、volatile、mutable、explicit、friend、using/typedef 別名、static_assert 編譯期斷言。

將本表單收藏,編碼/審碼/面試前快速掃描,可有效規避 90% 以上 C++ 經典陷阱。

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