面向對象綁定操作與數據,泛型編程將操作泛化應用於不同類型。C++ 模板在編譯期實例化,類型安全,優於宏的文本替換。
templateclass Test { ... }; // 通用模板 template<> class Test { ... }; // 全特化 template class Test { ... }; // 偏特化
編譯器執行隱式轉換:左值轉換、修飾符去除、派生到基類。顯式指定類型參數:`min
templateT min(T x, T y) { return x long min (long x, long y) { return x 模板聲明、定義與編譯模型
關鍵規則:模板實例化發生在編譯期,故聲明與定義必須在同一編譯單元。兩種做法:
- 將聲明與定義放在同一 `.h` 或 `.cpp` 中,使用時 `#include` 該文件(推薦)。
- 分離 `.h` 和 `.cpp`,但在 `.cpp` 末尾 `#include "xxx.h"`,使用時 `#include "xxx.cpp"`(較少用)。
類模板實例:Array 容器
實現動態數組,支援拷貝構造、賦值、下標運算符重載(const 版本),演示模板類完整定義。
函數對象
重載 `operator()` 的類,可作為模板參數傳遞,擁有狀態。標準庫算法大量使用(如 `sort` 的比較器)。
struct Add { int operator()(int a, int b) { return a+b; } }; // 使用:Add add; add(2,3); // 5實用建議
- 優先使用標準庫容器/算法,減少手寫模板。
- 模板代碼保持簡潔,複雜邏輯提取到非模板輔助函數。
- 善用 `typename`/`class`、`typename T::type` 等依賴類型語法。
- C++17 起可用 `if constexpr` 簡化編譯期分支。