Инициализировать статический неконстантный элемент данных класса - PullRequest
0 голосов
/ 09 декабря 2011

Я написал следующий пример кода:

class MyClass {
    static int a;
  public:
    MyClass ( int i ) : a ( i )    {
      cout << " \n ctor called. a is : "<< a << " \n";
    }
};

int   MyClass::a = 1;   

int main( ) {
    MyClass my(2);
}

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

Итак, как инициализировать статический член данных каждый раз, когда создается объект класса? Я надеюсь, что статическая функция-член, вызываемая из конструктора, сможет это сделать. Это единственный возможный способ?

Ответы [ 4 ]

5 голосов
/ 09 декабря 2011

Simple, присваивает значение a в теле конструктора:

MyClass ( int i )  {
  a = i;
  cout << " \n ctor called. a is : "<< a << " \n";
}

Вы не можете использовать список инициализатора для этого, потому что a не инициализируется , просто присваивается новое значение. Перед вызовом конструктора при запуске программы a будет инициализирован значением 0 (неинициализированные static переменные установлены в 0).

Это то, что говорит вам компилятор, что довольно просто:

ошибка: int MyClass :: a является статическим членом данных; его можно инициализировать только при его определении

Хотя это выглядит глупо, вы уверены, что это должно быть static, а не переменная экземпляра? Только один экземпляр переменной static существует в вашей программе и имеет время жизни от начала выполнения программы до ее завершения.

РЕДАКТИРОВАТЬ: Кажется, вы понимаете, что будет только один экземпляр переменной static, судя по одному из ваших комментариев. Просто обратите внимание, что инициализация и назначение - это две разные вещи.

2 голосов
/ 09 декабря 2011

Ключевое слово static указывает, что ваша переменная-член не будет иметь своего собственного значения для каждого экземпляра класса, а будет иметь одно значение, которое инициализируется с помощью строки кода, которую вы написали:

int   MyClass::a = 1;

Цель конструкторазаключается в инициализации экземпляра , но члены статических переменных не имеют отношения к экземплярам, ​​поэтому вы не можете инициализировать их в списке инициализации, который используется для инициализации нестатических элементов.Если вы присвоите значение своей переменной, отсутствующей в списке инициализации вашего конструктора, вы просто замените значение вашей переменной, поскольку оно статическое.

Вы должны прочитать об этом здесь: http://www.bogotobogo.com/cplusplus/statics.php

1 голос
/ 09 декабря 2011

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

Но чтобы ответить на ваш вопрос: Да, вы можете вызвать статическую функцию-член, чтобы установить переменную.Или просто установите его в теле функции, а не в списке инициализатора.

0 голосов
/ 09 декабря 2011

How to initialize the static data member each time an object of the class is created?

Вы не можете сделать это.Статический член данных не является частью объекта / экземпляра класса, но является объектом сам по себе, создан и инициализирован только один раз, обычно при запуске программы.При создании нового экземпляра класса вы можете присвоить ему новое значение .(Но вопрос в том, зачем вам это делать - используйте нестатический член, который должен быть специфичным для экземпляра; статические члены являются общими для всех экземпляров класса.)область видимости файла, и это место, где вы можете явно инициализировать его, как вы это делали в своем примере.Если вы опустите инициализатор (1), ваша переменная, поскольку она имеет статическую длительность, будет инициализирована компилятором с 0.

...