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