2012-02-18 23 views
2

デフォルトコンストラクタ(コンパイラ生成)を使用した初期化 「静的初期化」または「動的初期化」ですか?コンパイル時またはであること動的初期化、すなわち、それが初期化または他のもののために他のファイルでiを使用しても安全である -スタティックまたはダイナミック初期化時

は、私がここで

class test{ 
    int m; 

public : 
    test(): m(12) {} 

}; 

test i; 

int main() 
{// 
} 

にするときiが初期化取得されていることを意味ですか?
ユーザがデフォルトのコンストラクタを定義している場合はどうなりますか?

+3

質問の要点は、「グローバル/名前空間スコープオブジェクトの初期化は、それらのオブジェクトにユーザー定義のコンストラクタがあるとどうなりますか?」です。答えは、標準の '§3.6.2'にあります。この場合、 'i.m'は静的にゼロに初期化され、動的に12に初期化されますが、デフォルトのコンストラクタが' constexpr'と宣言された場合、 'i.m'は静的に12に初期化されます。 – Mankarse

答えて

2

testにはコンストラクタがあるため、オブジェクトの初期化時に実行されます。オブジェクトはゼロに初期化されたメモリ領域に配置されます。オブジェクトが作成される前と後のあなたも、i.mを使用して値を初期化することによってこれをテストすることができます

extern test i; 
int dummy1 = i.m; 
test i; 
int dummy2 = i.m; 

あなたがdummy1dummy2を印刷するときは、それぞれ012を取得する必要があります。あなたは静的にiを初期化したい場合は、しかし、

test i = { 12 }; 

のようにPODを持つこの唯一の作品を何かを使用する必要があります。すべてのことに言えば、グローバルデータは常に悪いことに注意してください。ちょっと気にしないでください。

関連する問題