7

如何在 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’
4

3 回答 3

27

在 C++03 中,您可以使用构造函数中的成员初始化器列表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 中,此限制已放宽,可以为类主体中的类成员分配值。换句话说,如果你等待几年来编译你的原始代码,它应该编译得很好。:-)

于 2011-07-31T19:28:32.347 回答
6

在构造函数初始化列表中对其进行初始化。

class a
{
  const int y;
public:
  a() : y(2) { }
};
于 2011-07-31T19:26:56.330 回答
4

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

a::a() : y(2) {}
于 2011-07-31T19:27:15.940 回答