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:很好地总结了一下!:-)