在类定义之外定义静态const

Ern*_*nie 6 c++ c++11

我们应该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;  
}
Run Code Online (Sandbox Code Playgroud)

评论之后// const int abc::period;,两个版本的代码在gcc 4.3.4上运行良好.所以我想问为什么两个版本都可以使用,哪个版本符合标准?

Pra*_*rav 8

您正在通过编写来定义静态成员.您可以为类的成员提供类内初始值设定项,但这不是定义,但这只是一个声明.periodconst int abc::period;static const

9.4.2/4 - 如果静态数据成员是const integer或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式(5.19).在这种情况下,成员可以出现在整数常量表达式中.如果在程序中使用该成员,并且名称空间范围定义不包含初始化程序,则该成员仍应在名称空间作用域中定义.

即使没有定义,您的代码也会编译,因为您没有获取静态成员的地址.Bjarne Stroustrup在C++中提到 - 这里的常见问题解答如果(并且仅当)它具有类外定义,您可以获取静态成员的地址