說明
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;
}
運(yùn)行及結(jié)果
$ g++ init_order.cpp
$ ./a.out
a: 1, b: 2
風(fēng)險(xiǎn)分析
當(dāng)類的成員初始化有依賴關(guān)系(如某個(gè)成員的構(gòu)造函數(shù)的參數(shù)是另一個(gè)成員)時(shí),較容易出錯(cuò)。這是因?yàn)槌绦騿T的意圖(初始化列表順序)和程序的行為(成員聲明 順序)是分離的,前者一般位于實(shí)現(xiàn)文件,后者位于頭文件,編輯前者往往忽略后者。因此少用有依賴的初始化設(shè)計(jì),并且在review中加入該檢查條目。