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