Подтвердить что ты не робот

Почему я не могу инициализировать мой статический член данных в моем конструкторе

Я прочитал ответ в parashift, но мне нужны детали бит о том, почему компилятор не позволяет определять статическую переменную-член в конструкторе.

Ответ будет высоко оценен.

Спасибо.

4b9b3361

Ответ 1

статические переменные-члены не связаны с каждым объектом класса. Он разделяется всеми объектами. Если вы инициализируетесь в ctor, это означает, что вы пытаетесь связать себя с конкретным экземпляром класса. Поскольку это невозможно, это не разрешено.

Ответ 2

Я предполагаю, что вы ссылаетесь на его использование в списке инициализации для конструктора. Статический член данных распределяется между всеми экземплярами класса. Его можно инициализировать один раз (по определению инициализации), поэтому было бы бессмысленно инициализировать его для каждого экземпляра.

Однако вы можете присвоить ему значение (или изменить существующее значение) в теле конструктора. Или, если элемент данных является константой, вы можете инициализировать его статически вне конструктора.

Ответ 3

Статическая переменная

не может быть определена внутри любого метода (даже если статический метод), однако вы можете определить статическую переменную вне конструктора и присвоить значение внутри конструктора. Но при этом переменная будет доступна для всего класса.

Ответ 4

1) Статические переменные являются свойством класса, а не объекта. 2) Любая статическая переменная инициализируется до создания любых объектов.

  • Вот почему компилятор не позволяет определять статическую переменную внутри конструктора, поскольку конструктор будет вызываться при создании объекта.

Ответ 5

Список инициализации членов обозначает инициализацию. Элемент static уже инициализирован в начале вашей программы (до main). Если бы вы могли делать то, что вы предлагаете, вы бы "повторно инициализировали" член static с каждым созданным вами объектом, но объекты инициализировались только один раз.

Вместо этого, если вы хотите изменить значение объекта после его инициализации, вам нужно назначить ему.