Нестатические члены данных const - PullRequest
7 голосов
/ 31 июля 2011

Как определить нестатический элемент данных const класса в C ++? Если я попытаюсь скомпилировать следующий код:

class a
{
public:
    void print()
    {
        cout<<y<<endl;
    }
private:
    const int y=2;
};

int main()
{
    a obj;
    obj.print();
}

Я получаю ошибку

ISO C++ forbids initialization of member ‘y’

Ответы [ 3 ]

27 голосов
/ 31 июля 2011

В C ++ 03 вы можете инициализировать const поля класса, используя list-initializer list в конструкторе.Например:

class a
{
public:
    a();

    void print()
    {
        cout<<y<<endl;
    }

private:
    const int y;
};

a::a() : y(2)
{
    // Empty
}

Обратите внимание на синтаксис : y(2) после конструктора.Это говорит C ++, чтобы инициализировать поле y, чтобы оно имело значение 2. В более общем смысле, вы можете использовать этот синтаксис для инициализации произвольных членов класса теми значениями, которые вы хотите, чтобы они имели.Если ваш класс содержит const членов данных или членов данных, которые являются ссылками, это единственный способ правильно их инициализировать.

Обратите внимание, что в C ++ 11 это ограничение ослаблено, и его можно назначить правильно.значения для членов класса в теле класса.Другими словами, если вы подождете несколько лет, чтобы скомпилировать исходный код, он должен скомпилироваться просто отлично.: -)

6 голосов
/ 31 июля 2011

Инициализируйте его в списке инициализации конструктора.

class a
{
  const int y;
public:
  a() : y(2) { }
};
4 голосов
/ 31 июля 2011

Вы не можете использовать инициализатор внутри определения класса. Вам нужно использовать инициализацию конструктора вместо:

a::a() : y(2) {}
...