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

18

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

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

Спасибо.

    
задан mahesh 24.02.2010 в 06:39
источник

5 ответов

25

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

    
ответ дан Naveen 24.02.2010 в 06:41
5

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

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

    
ответ дан jamesdlin 24.02.2010 в 06:43
0
Статическая переменная

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

    
ответ дан Jojo Sardez 24.02.2010 в 06:54
0

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

  • Вот почему компилятор не позволяет определять статическую переменную внутри конструктора, поскольку конструктор будет вызываться при создании объекта.
ответ дан Rise 24.02.2010 в 07:41
  • Собственно, статические переменные могут быть самими объектами ... –  Matthieu M. 24.02.2010 в 09:29
0

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

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

ответ дан Davit Tevanian 01.02.2017 в 08:39