Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#cpp #static #constructor


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

static A a;

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


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

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

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


Ответы

Ответ 1



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

Ответ 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; } Становится ясным, что первыми создаются глобальные обьекты, а другие(независимо от того статические или нет) создаются по той схеме, по какой они обьявлены.

Комментариев нет:

Отправить комментарий