Подскажите, пожалуйста, когда для статичного объекта в C++ вызывается конструктор?
static A a;
void func()
{
static B b;
// ...
}
Я предполагаю, что для локального объекта b конструктор будет вызываться при первом обращении к такому объекту.
Так же я предполагаю, что для глобального объекта a конструктор будет вызван в неопределенном порядке при запуске программы.
Верно ли мое представление?
Для локального статического объекта b конструктор будет вызван тогда, когда управление в первый раз пройдет по вышеприведенному объявлению.
Для статического объекта a, определенного на уровне пространства имен, конструктор будет вызван не позже, чем произойдет первое обращение к какому-то объекту или функции, определенным в этой же единице трансляции. Такие объекты инициализируются в порядке сверху-вниз, как они определены в данной единице трансляции. Таким образом, порядок инициализации разных единиц трансляции не специфицируется, а вот порядок инициализации таких объектов внутри каждой единицы трансляции задан однозначно.
Можете проверить сами. Достаточно написать программу типа такой:
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;
}
Становится ясным, что первыми создаются глобальные обьекты, а другие(независимо от того статические или нет) создаются по той схеме, по какой они обьявлены.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей