初期化リストの初期化順
初期化リストでのメンバ変数の初期化は宣言順に行われるらしい。
#include <iostream> class CTest{ public: int mValue1; int mValue2; CTest():mValue1(10),mValue2(mValue1+10){} }; int main() { using namespace std; CTest Test; cout << Test.mValue2 << ends; }
実行結果
20
これはOK
#include <iostream> class CTest{ public: int mValue2; int mValue1; CTest():mValue1(10),mValue2(mValue1+10){} }; int main() { using namespace std; CTest Test; cout << Test.mValue2 << ends; }
実行結果
4262250
明らかにおかしい。
初期化子の記述の順番に関係なく宣言順に初期化されるため、
mValue2の初期化子の中で呼んでいるmValue1がまだ初期化され
ていないのが原因らしい。
ちなみにググったら
warning: `CTest::mValue1' will be initialized after
的な警告が出るみたいなんだけど
gcc3.4.4 -Wallオプション付き
VC8 /W4 オプション
で共に何も警告されず。ぬー。
あれ?
勘違い、gcc3.4.4では警告された。