C++エンコーダゲージ(004):クラスメンバー変数の定義と初期化の順序を一致させる
1874 ワード
軍規保持クラスメンバー変数の定義と初期化の順序が一致する
Always declare and initialize member variables in the same order
解読する
(1)一例
実行結果
プログラムが望む結果は
(2)クラスの初期化リストでメンバー変数を初期化する際には,必ず変数定義の順序で初期化シーケンスを書くことがベストプラクティスである.
Always declare and initialize member variables in the same order
解読する
(1)一例
#include
class Range
{
public:
Range() : min_(0), max_(min_ + 10){}
int GetMin()
{
return min_;
}
int GetMax()
{
return max_;
}
private:
int max_;
int min_;
};
int main(int argc, char *argv[])
{
Range r;
std::cout << "min_ = " << r.GetMin() << " max_ = " << r.GetMax() << std::endl;
return 0;
}
実行結果
min_ = 0 max_ = 12595198
プログラムが望む結果は
min_=0 max_=10
の実際の結果max_であるべきである.の値を大きくします.これは、コンパイラがメンバー変数を初期化するときに、クラスの初期化リストで指定された順序ではなく、変数によって定義された順序であるためです.上記の例では、max_
はmin_
より前に定義されているが、初期化リストではmax_
はmin_
より後であり、実際にはmax_(min + 10)
が実行されたときにmin_
は初期化されていない.例の2つの変数の定義順序を逆にすると、次のようになります.min_ = 0 max_ = 10
(2)クラスの初期化リストでメンバー変数を初期化する際には,必ず変数定義の順序で初期化シーケンスを書くことがベストプラクティスである.