Я новичок в CPP.
Мне нужно добавить статический член, который можно вызывать из статического метода.
Так что в .h я заявляю это:
static uint32_t s_MyStaticMember;
Над моим конструктором (в «пространстве имен») я его инициализирую:
uint32_t MyClassName::s_MyStaticMember;
Теперь я могу использовать этот статический член из моего статического метода.
Вопрос в том, если я инициализирую член с = 0;
uint32_t MyClassName::s_MyStaticMember=0;"
Что произойдет в следующем экземпляре класса?
Я предполагаю, что статический член не будет сброшен в 0, потому что по этой причине инициализация находится вне класса, = 0 произойдет только один раз .
Правильно ли мое предположение?
2 ответа
Статические переменные инициализируются только один раз, на этапе статической инициализации запуска программы (ссылка: [ basic.start.static ] ) . Компилятор отвечает за то, чтобы убедиться, что существует только один экземпляр Counted::count
, и что он инициализируется ровно один раз, до запуска любого другого кода.
Обратите внимание, что если вы не инициализируете статический файл явно (поэтому вы просто определяете его без = 0
), он в любом случае инициализируется нулями по умолчанию.
Создание экземпляров вашего класса вообще не влияет на неэкземплярные (т. Е. Статические) члены, , если ваш конструктор явно не пишет в них, например.
struct Counted {
static unsigned count;
Counted() { ++count; }
~Counted() { --count; }
};
unsigned Counted::count;
Конструктор делает изменяет статическое, но он не повторно инициализирует его.
Да. Статические переменные-члены сродни глобальным переменным в пространстве имен. У них только один экземпляр. Их инициализация произойдет только один раз до того, как выполнение войдет в ваш main ().
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.