@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com

Статические переменные в c++.


Статические переменные в 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