兩類靜態成員的初始化區別
| 類型 | 可否類內初始化 | 類外定義位置 | 構造函數/初始化列表 |
| static const 整型/枚舉型 | ✅ 允許(C++11 起擴展至字面類型) | 可選(若需取地址必須類外定義) | ❌ 禁止 |
| static 非常量 / 非整型 const | ❌ 僅聲明 | ✅ 必須在類外(.cpp)定義並初始化 | ❌ 禁止 |
代碼示範
// MyClass.h
class MyClass {
static const int MAX = 100; // 類內初始化 OK
static const double PI; // 僅聲明
static int count; // 僅聲明
};
// MyClass.cpp
const double MyClass::PI = 3.14159; // 類外定義+初始化
int MyClass::count = 0; // 類外定義+初始化
常見誤區
- 在構造函數中賦值:
MyClass() { count = 0; } ❌ 每次構造都會重置,違背「靜態成員屬於類」的語義。
- 頭文件中直接定義:
int MyClass::count = 0; ❌ 多文件包含導致重複定義鏈接錯誤。
- C++17
inline static:inline static int count = 0; 可直接在類內定義,無需 .cpp,推薦現代項目使用。
最佳實踐
- 整型/枚舉型
static const 優先類內初始化。
- 其他靜態成員在 唯一 .cpp 中定義並初始化。
- C++17 起統一用
inline static 簡化項目結構。