Я новичок в CPP.
Мне нужно добавить статический член, который можно вызывать из статического метода.
Так что в .h я заявляю это:

static uint32_t s_MyStaticMember; 

Над моим конструктором (в «пространстве имен») я его инициализирую:

uint32_t MyClassName::s_MyStaticMember;

Теперь я могу использовать этот статический член из моего статического метода.
Вопрос в том, если я инициализирую член с = 0;

uint32_t MyClassName::s_MyStaticMember=0;" 

Что произойдет в следующем экземпляре класса?
Я предполагаю, что статический член не будет сброшен в 0, потому что по этой причине инициализация находится вне класса, = 0 произойдет только один раз .

Правильно ли мое предположение?

0
ilansch 14 Авг 2019 в 19:40

2 ответа

Лучший ответ

Статические переменные инициализируются только один раз, на этапе статической инициализации запуска программы (ссылка: [ basic.start.static ] ) . Компилятор отвечает за то, чтобы убедиться, что существует только один экземпляр Counted::count, и что он инициализируется ровно один раз, до запуска любого другого кода.

Обратите внимание, что если вы не инициализируете статический файл явно (поэтому вы просто определяете его без = 0), он в любом случае инициализируется нулями по умолчанию.

Создание экземпляров вашего класса вообще не влияет на неэкземплярные (т. Е. Статические) члены, , если ваш конструктор явно не пишет в них, например.

struct Counted {
  static unsigned count;
  Counted() { ++count; }
  ~Counted() { --count; }
};

unsigned Counted::count;

Конструктор делает изменяет статическое, но он не повторно инициализирует его.

3
Useless 14 Авг 2019 в 16:51

Да. Статические переменные-члены сродни глобальным переменным в пространстве имен. У них только один экземпляр. Их инициализация произойдет только один раз до того, как выполнение войдет в ваш main ().

3
user1316208 14 Авг 2019 в 16:52