非静态const数据成员

时间:2011-07-31 19:24:46

标签: c++ initialization members

如何在C ++中定义类的非静态const数据成员?如果我尝试编译以下代码:

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 个答案:

答案 0 :(得分:27)

在C ++ 03中,您可以使用构造函数中的 member-initializer list 初始化类的const个字段。例如:

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中,放宽了此限制,可以将值分配给类主体中的类成员。换句话说,如果你等待几年来编译你的原始代码,它应该编译得很好。 : - )

答案 1 :(得分:6)

在构造函数初始化列表中初始化它。

class a
{
  const int y;
public:
  a() : y(2) { }
};

答案 2 :(得分:4)

您不能在类定义中使用初始化程序。您需要使用构造函数初始化:

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