Adam Pierceのコードをもう一度テストして、さらに 2 つのケースを追加しました。クラス内の静的変数と POD 型です。私のコンパイラは、Windows OS(MinGW-32) の g++ 4.8.1 です。結果はクラス内の静的変数であり、グローバル変数と同じように扱われます。そのコンストラクターは、メイン関数に入る前に呼び出されます。
- クラスのグローバル変数と静的メンバー: コンストラクターは、メイン関数(1)に入る前に呼び出されます。
- ローカル静的変数: コンストラクターは、実行が最初にその宣言に到達したときにのみ呼び出されます。
- ローカル静的変数が POD タイプの場合、メイン関数(1)に入る前にも初期化されます。POD タイプの例: static int number = 10;
(1) : 正しい状態は、「同じ翻訳単位からの関数が呼び出される前」である必要があります。ただし、以下の例のように単純な場合は、メイン関数です。
#include <iostream>
#include <string>
using namespace std;
class test
{
public:
test(const char *name)
: _name(name)
{
cout << _name << " created" << endl;
}
~test()
{
cout << _name << " destroyed" << endl;
}
string _name;
static test t; // static member
};
test test::t("static in class");
test t("global variable");
void f()
{
static test t("static variable");
static int num = 10 ; // POD type, init before enter main function
test t2("Local variable");
cout << "Function executed" << endl;
}
int main()
{
test t("local to main");
cout << "Program start" << endl;
f();
cout << "Program end" << endl;
return 0;
}
結果:
static in class created
global variable created
local to main created
Program start
static variable created
Local variable created
Function executed
Local variable destroyed
Program end
local to main destroyed
static variable destroyed
global variable destroyed
static in class destroyed
Linux env でテストされた人はいますか?