static 在 C++ 中根據上下文呈現三種截然不同的行為:
單一原始檔專案中兩者無差異;多檔案專案中,static 全域變數僅在定義該變數的編譯單元內可見,有效避免符號衝突,是大型專案模組化的基礎技術。
| 特性 | new/delete | malloc/free |
|---|---|---|
| 本質 | C++ 運算子,可重載 | C 標準庫函數 |
| 建構/解構 | 自動呼叫建構函式/解構函式 | 僅分配/釋放原始記憶體 |
| 型別安全 | 回傳帶型別指標 | 回傳 void*,需強制轉型 |
| 失敗處理 | 拋出 std::bad_alloc 異常 | 回傳 NULL |
| 實現關係 | 底層通常呼叫 malloc/free | 系統級記憶體分配介面 |
關鍵區別:delete 僅呼叫一次解構函式,delete[] 會依序呼叫陣列每個元素的解構函式,混用會導致未定義行為。
引用是變數的別名,編譯器層面實現,無額外記憶體開銷。核心規則:
& 操作從呼叫端移至被呼叫端,簡化介面設計唯一語法差異:struct 預設存取層級為 public,class 為 private。繼承時同理。記憶體佈局、成員函式、虛函數機制完全一致。
const int MAX_SIZE = 100; // 必須初始化,具有型別檢查優勢
const int* p1; // 指向常數的指標,內容不可修改
int const* p2; // 同上,語法糖
int* const p3 = &x; // 常數指標,指向固定位址
const int* const p4 = &x; // 雙重約束
void func(const int& param) 避免拷貝且保護資料const int func() 防止修改暫時物件void func() const 承諾不修改非靜態成員,const 物件只能呼叫 const 成員函數const 擁有型別、作用域、命名空間約束,支援除錯符號;#define 純文字替換,無型別檢查,汙染全域命名空間。
sizeof(array) 得到陣列總大小,sizeof(ptr) 得到指標本身大小(通常 4/8 位元組)char/short 先提升為 int| 特性 | sizeof | strlen |
|---|---|---|
| 本質 | 編譯期運算子 | 執行期函數 |
| 計算對象 | 型別、變數、陣列、指標 | 以 null 結尾的字串 |
| 陣列參數 | 編譯期分配的總位元組數 | 字串實際長度(不含結尾 null) |
| 指標參數 | 指標變數大小(4/8 位元組) | 從該位址尋找 null 為止的長度 |
vptr → vtable → function address,實現動態綁定高位址 ├─────────────────┤ 棧區 - 自動分配釋放,向下增長 ├─────────────────┤ 堆區 - 手動管理,向上增長 ├─────────────────┤ 全域/靜態區 - 已初始化/未初始化分區 ├─────────────────┤ 常數區 - 字串常值 ├─────────────────┤ 程式碼區 - 二進位指令 低位址
棧向低位址增長,堆向高位址增長,中間留有巨大間隙防止碰撞。
new Type() 值初始化,new Type 預設初始化(內建型別不初始化)int* ptr;
ptr++; // 等價於 ptr + 1*sizeof(int),自動按元素大小步進
ptr2 - ptr1; // 計算元素個數差值,編譯器自動除以 sizeof(int)
sizeof(Class) = 非靜態資料成員總和 + 對齊填充 + 虛函數指標(若有虛函數)
| 宣告 | 名稱 | 含義 |
|---|---|---|
int (*f)(int) | 函數指標 | 指向函數的指標變數 |
int* f(int) | 指標函數 | 回傳指標的函數 |
int* a[10] | 指標陣列 | 陣列元素皆為指標 |
int (*a)[10] | 陣列指標 | 指向陣列的指標 |
int const* p | 常數指標 | 指向常數,內容不可改 |
int* const p | 指標常數 | 指標本身不可改 |
句柄是雙重間接索引:Handle → 表格索引 → 核心物件位址。Windows 核心物件(檔案、執行緒、視窗)頻繁移動/變更,句柄提供穩定介面,隱藏實作細節;指標直接持有記憶體位址,適用於單一進程內部。
delete,不支援陣列shared_ptr 銷毀時自動釋放資源打破循環引用,不增加引用計數,需 lock() 取得 shared_ptr 後使用。
Class* const,不可修改指向size_type(通常為 size_t)int 進行容器索引/大小運算size_t(-1) 為最大值,邏輯判斷需謹慎operator+ 回傳物件,operator= 回傳引用支援鏈式賦值operator<< 回傳 ostream& 實現串聯| 舊式 | 現代 C++ | 說明 |
|---|---|---|
<stdio.h> | <cstdio> | C 標頭檔加 c 前綴,符號在 std 命名空間 |
<iostream.h> | <iostream> | C++ 標頭檔移除 .h |
| 類內/友元 | 衍生類 | 外部物件 | |
|---|---|---|---|
| private | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ |
class Abstract {
virtual void interface() = 0; // 純虛函數
}; // 無法實例化,強制衍生類實作
static_cast:編譯期檢查,基礎型別轉換、類別層級向上轉換dynamic_cast:執行期 RTTI 檢查,安全向下轉型,需多態基類const_cast:移除/添加 const 屬性reinterpret_cast:位元級重新解釋,極度危險// 推薦:具體引入
using std::vector;
using std::string;
// 避免:汙染全域命名空間
using namespace std;
淺拷貝僅複製成員位元,深拷貝需手動實作資源重新分配。
輔以配接器、配置器、函數物件等組件,實現泛型程式設計。
| 容器 | 底層結構 | 隨機存取 | 頭尾插刪 | 中間插刪 | 適用場景 |
|---|---|---|---|---|---|
| vector | 動態陣列 | O(1) | 尾部 O(1) 擴容 | O(n) | 預設首選,需隨機存取 |
| deque | 分段連續陣列 | O(1) | O(1) | O(n) | 雙端高頻操作 |
| list | 雙向鏈表 | 不支援 | O(1) | O(1) | 大量中間插刪 |
| 容器 | 底層 | 鍵值 | 有序 | 重複鍵 | 查找/插入/刪除 |
|---|---|---|---|---|---|
| map | 紅黑樹 | key-value | 是 | 否 | O(log n) |
| set | 紅黑樹 | key only | 是 | 否 | O(log n) |
| multimap | 紅黑樹 | key-value | 是 | 是 | O(log n) |
| multiset | 紅黑樹 | key only | 是 | 是 | O(log n) |
| unordered_map | 雜湊表 | key-value | 否 | 否 | 平均 O(1) |
| unordered_set | 雜湊表 | key only | 否 | 否 | 平均 O(1) |
dequedequevectors.size()/length() // 字元數
s.empty() // 是否為空
s[n] / s.at(n) // 存取(at 有邊界檢查)
s.substr(pos, len) // 子字串
s.find(str) // 查找,失敗回傳 npos
s.append(args) // 尾部追加
reverse(s.begin(), s.end()) // 反轉
find(first, last, val) // 線性查找
sort(first, last) // 快速排序 O(n log n)
stable_sort(first, last) // 穩定排序
reverse(first, last) // 反轉序列
swap(a, b) // 交換兩物件
lower_bound/upper_bound // 二分查找邊界
const/enum/inline 替代 #defineconst:語義明確、編譯器優化、介面契約private 未定義或繼承 Uncopyablevirtual 解構函數operator= 回傳 *this 參考支援鏈式賦值operator= 處理自我賦值shared_ptr/unique_ptrget()new/delete 形式配對:陣列用 []new 物件置入智能指標:防異常洩漏const T& 替代 T:避免拷貝、防切割private:封裝彈性、不變式維護non-member non-friend 替代成員函數:增強封裝swap:高效交換、強異常安全基石inline:編譯器建議、適合小熱點函數is-a:基類契約對衍生類生效using Base::funcstd::functionhas-a / is-implemented-in-terms-oftypename 雙重語義:樣板參數聲明、嵌套從屬型別標識this->、usingnew_handler 機制:分配失敗回調new/delete 時機:檢測錯誤、效能優化、統計收集placement new 需對應 placement deletestd::array, tuple, regex, thread 等