类定义之外的静态const定义

问题描述

| 即使在类内部进行了初始化,我们也应该在类定义之外定义“ 0”成员吗?
#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;  
}
在注释“ 2”之后,两个版本的代码都可以在gcc 4.3.4上正常运行。所以我想问为什么两个版本都可以工作,哪个版本符合标准?     

解决方法

您正在通过写
const int abc::period;
定义静态成员
period
。您可以为一个类的“ 0”成员提供一个类内初始化器,但这不是定义,而仅仅是一个声明。   9.4.2 / 4-如果静态数据成员是const整型或const枚举类型,则其在类定义中的声明可以指定一个常量初始化器,该初始化器应为整数常量表达式(5.19)。在这种情况下,成员可以出现在整数常量表达式中。如果在程序中使用了该成员,则该成员仍应在命名空间范围内定义,并且该命名空间范围定义不应包含初始化程序。 即使没有定义,您的代码也会编译,因为您没有使用静态成员的地址。 Bjarne Stroustrup在C ++-FAQ中提到,当(且仅当)静态成员具有类外定义时,您可以使用静态成员的地址。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...