本文匯整 C++ 核心語法中最易踩坑、面試高頻考察的知識點,採「分類→核心規則→代碼範例」結構,涵蓋物件生命週期、const 語意、異常處理、繼承與虛函數、模板機制、STL 容器/演算法/迭代器特性,作為查漏補缺速查手冊。
const 成員、參考成員、無預設建構子的成員物件、基類建構子需參數時。~ClassName(),無參數、無回傳、不可多載。delete 指標、容器銷毀)。delete base_ptr 僅呼叫基類解構子 → 派生類資源洩漏。ClassName(const ClassName&) (參數必須為引用,否則無限遞迴)。ClassName& operator=(const ClassName&),必為成員函數。return *this。| 形式 | 語意 | 關鍵規則 |
|---|---|---|
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 期間建構且未解構的區域物件,**自動按逆序解構**。void f() throw(int, double) 限制拋出型別;違規觸發 std::unexpected (預設終止)。現代用 noexcept。throw; 在 catch 中重拋**原始異常物件** (非副本)。| 繼承 | 基類 public | 基類 protected | 基類 private |
|---|---|---|---|
| public | public | protected | 不可存取 |
| protected | protected | protected | 不可存取 |
| private (預設) | private | private | 不可存取 |
using Base::func; 或 Base::func() 顯式存取。class B1: virtual public Base。virtual 函數。直接用物件呼叫虛函數 = 靜態綁定。
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*>。vector/string/deque:插入/刪除/擴容 → **所有迭代器失效**;reserve 可避免擴容失效。list/forward_list:僅被刪除元素的迭代器失效,其餘穩定。map/set 族:僅被刪除元素的迭代器失效。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++ 經典陷阱。