我们是否应该在类定义之外定义static const
成员,即使它是在类中初始化的?
#include<iostream>
using namespace std;
class abc
{
static const int period=5;
int arr[period];
public:
void display()
{
cout<<period<<endl;
}
};
const int abc::period;
int main()
{
abc a;
a.display();
return 0;
}
评论// const int abc::period;
后,两个版本的代码在gcc 4.3.4上运行正常。所以我想问为什么两个版本都可以使用,哪个版本符合标准?
答案 0 :(得分:8)
您通过撰写period
定义静态成员const int abc::period;
。您可以为类的static const
成员提供类内初始值设定项,但这不是定义,但这只是一个声明。
9.4.2 / 4 - 如果静态数据成员是const整数或const枚举类型,它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19)。在这种情况下,成员可以出现在整数常量表达式中。如果在程序中使用该成员,并且命名空间作用域定义不包含初始化程序,则该成员仍应在名称空间作用域中定义。
您的代码即使没有定义也会编译,因为您没有获取静态成员的地址。 Bjarne Stroustrup在C ++中提到 - FAQ here 你可以获取静态成员的地址,如果(并且只有)它有一个类外定义