「成員初始化順序永遠遵循類別宣告順序,而非初始化列表書寫順序。」
class A {
int sum1;
int sum2;
public:
A() : sum2(sum1), sum1(10) {} // 危險:sum2 使用未初始化的 sum1
};
此處 sum2 會獲得隨機垃圾值,因 sum1 宣告在前但初始化在後。
sum2(10), sum1(10) 沒問題?A() : sum2(10), sum1(10) {} // 安全:sum2 不依賴 sum1
兩成員皆以字面常數初始化,無相依關係,故順序無影響。
這設計確保:
-Wreorder (GCC/Clang) 或 /Wall (MSVC) 自動檢測clang-tidy cppcoreguidelines-avoid-member-init-order 靜態分析
class A {
int sum1, sum2;
A(int v) : sum1(v), sum2(v) {} // 共同邏輯集中
public:
A() : A(10) {} // 委派給私有建構函式
};