Статические переменные в c++
Любая статическая переменная инициализурется нулём, ну, или, нулями, если явно не указать инициализируещее знание.
Но, это не совсем правда :)
Вы можете изменить её значение инициализации:
int main()
{
static int v1;
static int v2 = 3;
std::cout << v1 << std::endl;// will print 0
std::cout << v2 << std::endl;// will print 3
}
Пользовательская инициализация локальных статических переменных до c++11 не являются потокобезопасной.
Данный код до с++11 не корректен.
void func()
{
static int v = 1; // data rice before c++11!
v++;
std::cout << v << std::endl;
}
std::thread th1(func);
std::thread th2(func);
th1.join();
th2.join();
Так можно делать начиная с с++11 стандарта.
Время жизни статических объектов длится до завершения функции main и exit.
Вызов их деструкторов происходит в обратном порядке их конструирования:
struct T0 {
T0() { std::cout << "T0" << std::endl; }
~T0() { std::cout << "~T0" << std::endl; }
};
struct T1 {
T1() { std::cout << "T1" << std::endl; }
~T1() { std::cout << "~T1" << std::endl; }
};
int main(int argc, char *argv[])
{
std::cout << "enter to main" << std::endl;
{
static T1 t1;
static T0 t0 = T0{};
}
std::cout << "leave from scope" << std::endl;
}
Вывод:
enter to main T1 T0 leave from scope ~T0 ~T1