C++ 类定义之外的静态常量的定义

C++ 类定义之外的静态常量的定义,c++,c++11,C++,C++11,我们是否应该在类定义之外定义一个静态常量成员,即使它是在类内部初始化的 #include<iostream> using namespace std; class abc { static const int period=5; int arr[period]; public: void display() { cout<<period<<endl; }

我们是否应该在类定义之外定义一个
静态常量
成员,即使它是在类内部初始化的

#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;  
}
#包括
使用名称空间std;
abc班
{  
静态常数int周期=5;
int arr[期间];
公众:
无效显示()
{   
cout您通过编写
const int abc::period;
来定义静态成员
period
。您可以为类的
静态const
成员提供类内初始值设定项,但这不是定义,而仅仅是一个声明

9.4.2/4-如果静态数据成员为常量整数或常量枚举类型,则其在类定义中的声明可以指定常量初始值设定项,该初始值设定项应为整数常量表达式(5.19)。在这种情况下,该成员可以出现在整型常量表达式中。如果在程序中使用该成员,则该成员仍应在命名空间范围中定义,并且命名空间范围定义不应包含初始值设定项


您的代码即使没有定义也可以编译,因为您没有获取静态成员的地址。Bjarne Stroustrup在C++-FAQ中提到,如果(并且仅当)您可以获取静态成员的地址它有一个类外定义

@David:我试图在标准中搜索use这个词。不幸的是,在发布这篇文章时找不到相关的文本。:)我不久前也尝试过,在C++03中找不到任何可以发布的清晰定义,但作为左值使用,左值到右值的转换是不可能的rformed是一个稍微好一点的近似值。对于适用此定义且不使用地址的情况:
(cond?static_const:XXX)
,其中
cond
是一个条件,
static\u const
是类中的一个静态常量。如果
XXX
是一个右值,则不构成use。
static\u const
是一个右值,但立即转换为左值。如果
XXX
是一个左值,则构成use。不带地址。例如:
>结构测试{static const int s=1;};int main(int argc,char**){const int y=(argc
第一次使用
test::s
并不构成use:
argc
,常量是一个左值,但立即转换为右值(它的值)另一方面,
…:test::s)
不构成用法。三元表达式可以理解为(伪代码):
const int*\uu p;if(argcIf)表达式更改为
(argc
,然后在这两个子表达式中,都会立即转换为右值,它们不构成用法。等效的伪代码是:
int\uu i;if(argc
@David:很好地总结了一下!:-)