C++, когда вызывается конструктор статичного объекта?

120
17 сентября 2021, 07:10

Подскажите, пожалуйста, когда для статичного объекта в C++ вызывается конструктор?

static A a;
void func()
{
    static B b;
    // ...
}

Я предполагаю, что для локального объекта b конструктор будет вызываться при первом обращении к такому объекту.

Так же я предполагаю, что для глобального объекта a конструктор будет вызван в неопределенном порядке при запуске программы.

Верно ли мое представление?

Answer 1

Для локального статического объекта b конструктор будет вызван тогда, когда управление в первый раз пройдет по вышеприведенному объявлению.

Для статического объекта a, определенного на уровне пространства имен, конструктор будет вызван не позже, чем произойдет первое обращение к какому-то объекту или функции, определенным в этой же единице трансляции. Такие объекты инициализируются в порядке сверху-вниз, как они определены в данной единице трансляции. Таким образом, порядок инициализации разных единиц трансляции не специфицируется, а вот порядок инициализации таких объектов внутри каждой единицы трансляции задан однозначно.

Answer 2

Можете проверить сами. Достаточно написать программу типа такой:

struct A {  
    A(int n = 0) { 
        std::cout << "a";
        if (n)
            std::cout << n;
        std::cout << std::endl;
    }
};
A a;
void func()
{       
    A a2(2);
    const static A a3(3);
    static A a1(1);
    // ...
}
A a11(11);
void func10()
{
    static A a10(10);
    A a20(20);
    const static A a30(30); 
}
int main() {        
    func();
    func10();
    return 0;
}

Становится ясным, что первыми создаются глобальные обьекты, а другие(независимо от того статические или нет) создаются по той схеме, по какой они обьявлены.

READ ALSO
ненужные файлы codeblocks

ненужные файлы codeblocks

в codeblocks при работе создается куча ненужных файлов вроде:

104
Как называется обратный метод к next()? C++

Как называется обратный метод к next()? C++

Метод next () - возвращает указатель/итератор на следующий за каким-л элементомКак называется обратный метод? В голову пришёл back, но как вижу,...

125
не выводится 3d объект в opengl

не выводится 3d объект в opengl

Очень много времени трачу на этот код, пытаюсь найти ошибку, но не получаетсяЗдесь есть функция, которая считывает модель из файла

124