2013-11-09 14 views
7

C++ 11は次のように、宣言時にクラスのメンバーフィールドの値を設定サポートしています。C++ 11は初期化されたメンバフィールドを再初期化しますか?

class MyClass 
{ 
private 
    int test = 0; 
} 

私もこのようなコンストラクタで変数を初期化した場合:

class MyClass 
{ 
private 
    int test = 0; 

public: 
    MyClass() : test(1) 
    { 
    } 
} 

ますこれにより、変数にその値が2回設定されるか、またはコンパイラがこれを最適化して変数を1回だけ初期化するように指示します。仕様が何かを指示しない場合は、これに関する有名なコンパイラ(MSVC、GCCなど)の動作を知っていますか?

答えて

14

標準実際§12.6.2/ 9で、このための規則を有する:

所与非静的データメンバがブレース-OR-等しい初期およびMEM-初期化の両方を有する場合mem-initializerによって指定された初期化が実行され、非静的データメンバのブレースまたは同等イニシャライザ は無視されます。 [例:

struct A { 
int i = /∗ some integer expression with side effects ∗/ ; 
A(int arg) : i(arg) { } 
// ... 
}; 

考えるとA(INT)コンストラクタは、単純に引数の値iに初期化します、そして私のブレース・オア・イコール 初期化子での副作用は行われません。 - 最後の例]

だから、デフォルトコンストラクタが呼び出された場合は、上記の場合には、唯一の初期化が行われることになる、とtest1になります定義しました。