常數是執行期恆定不變的識別符。C 用 #define(巨集常數),C++ 除 #define 外還有 const(const 常數)。
直接在程式碼寫死數字/字串(Magic Number)的弊端:
規則 5-1-1:多次出現的數字/字串,盡量用語意直觀的常數表示。
#define MAX 100 // C 巨集常數
const int MAX = 100; // C++ const 常數
const float PI = 3.14159;
規則 5-2-1:C++ 程式僅使用 const 常數,完全取代巨集常數。
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2; // 體現關係
欲讓常數僅在類別內有效,#define 因全域可見無法滿足。直覺用 const 修飾資料成員,但 const 資料成員僅在單一物件生命週期內為常數,對整個類別而言是可變的(不同物件可有不同值)。
class A {
A(int size);
const int SIZE;
};
A::A(int size) : SIZE(size) { ... }
A a(100); // a.SIZE = 100
A b(200); // b.SIZE = 200
用 enum 實現整個類別恆定的常數:
class A {
enum { SIZE1 = 100, SIZE2 = 200 }; // 列舉常數
int array1[SIZE1];
int array2[SIZE2];
};
PI=3.14159)。浮點數類別常數無完美方案,常見做法:static const float PI = 3.14159f;(需在 .cpp 定義)或命名空間層級 const float PI = ...。