說明
C++類成員初始化順序取決于其聲明順序,而非初始化列表的順序。
測試代碼
/** * 測試類成員的初始化順序 * @file init_oder.cpp */#include <iostream>class Test {public: Test() : mBb(sIndex++), mAa(sIndex++) { }public: void Dump() { std::cout<< "a: " << mAa << ", b: " << mBb << std::endl; } protected: int mAa; int mBb; static int sIndex;};int Test::sIndex = 1;int main() { Test t; t.Dump(); return 0;}
運行及結果
$ g++ init_order.cpp
$ ./a.out
a: 1, b: 2
風險分析
當類的成員初始化有依賴關系(如某個成員的構造函數的參數是另一個成員)時,較容易出錯。這是因為程序員的意圖(初始化列表順序)和程序的行為(成員聲明 順序)是分離的,前者一般位于實現文件,后者位于頭文件,編輯前者往往忽略后者。因此少用有依賴的初始化設計,并且在review中加入該檢查條目。