2011-06-29 4 views
2

次のオブジェクトを数える単純なケースである:静的変数の前にクラスのオブジェクトをグローバル空間で宣言することはよく定義されていますか?

A obj; // comes 1st 
int A::count = 5; // comes 2nd 

g++ produces expected result:今

struct A 
{ 
    static int count; 
    A() { ++ count; } 
}; 

、そのオブジェクトとstaticメンバーは次のように宣言されています。しかし、A::countの定義は、グローバル空間内のAインスタンスの1つの後に来るので、の定義されていない動作であってはなりませんか?

+0

PODはゼロで初期化されます。静的の前方宣言は本当に前方にあるべきですが、Aが宣言されている場所に依存する可能性がありますグローバル、ネームスペースなどの範囲は、物事がどのように初期化されるかに関して重要な違いになります。 – AJG85

答えて

2

です。

静的 貯蔵期間(basic.stc.static)を持つオブジェクトのための記憶

3.6.2

はゼロで初期化(dcl.init) 他の初期化前に 行わなければなりません。ゼロ初期化と 定数付きの初期化は、まとめて スタティック初期化と呼ばれます。他のすべての 初期化は動的 初期化です。静的ストレージ の持続時間が の式(expr.const)で初期化されたPODタイプ (basic.types)のオブジェクトは、 の初期化が行われる前に に初期化されます。

PODは定数式で初期化されているため、静的に初期化されます。つまり、コンストラクタが実行される前です。これらの条件のいずれかを変更すると、予期しない結果が発生する可能性があります。

+1

結果は予期しない可能性がありますが、定数の初期化がなくても定義済みです。 –

関連する問題