MAX 勝過 100。規則 5-1-1:多次出現的字面值,**必提煉為有意義常數**。
| 維度 | const 常數 | #define 巨集常數 |
|---|---|---|
| 型別 | ✅ 有型別,編譯器型別檢查 | ❌ 無型別,純文字替換 |
| 除錯 | ✅ 整合除錯工具可監看 | ❌ 預處理階段消失,不可除錯 |
| 作用域 | ✅ 受作用域限制 | ❌ 全域汙染 |
| 邊際效應 | ✅ 無 | ❌ 文字替換易產生邏輯錯誤 |
規則 5-2-1:C++ 專案**全面棄用 #define 定義常數,改用 const**。
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2; // 語義綁定,修改 RADIUS 自動同步
const int SIZE = 100; 在類別宣告中**非法** (物件未建立時編譯器不知值)。
const 資料成員:**每個物件可有不同值**,初始化只能在建構函數初始化列表:
class A {
A(int size) : SIZE(size) {}
const int SIZE;
};
A a(100), b(200); // a.SIZE=100, b.SIZE=200
class A {
enum { SIZE1 = 100, SIZE2 = 200 }; // 編譯期常數,不佔物件空間
static const int SIZE3 = 300; // C++11 起類內初始化合法
constexpr int SIZE4 = 400; // C++11 編譯期常數
int arr1[SIZE1];
int arr2[SIZE2];
};
enum 缺點:隱含 int,無法表達浮點數 (如 PI=3.14159)。
**現代 C++ 首選**:static constexpr (型別安全、編譯期求值、可取位址)。