为什么在类中不允许初始化静态成员变量但是允许初始化const静态成员?

时间:2018-04-26 01:36:17

标签: c++

当我在类中声明时尝试初始化静态成员变量时,编译器会按预期抛出错误,因为我们需要为类外的静态成员变量显式分配空间。我认为静态const变量应该是相同的。但令我惊讶的是,类中的静态const成员变量的初始化工作正常。任何人都可以让我知道为什么不允许以相同的方式进行正常的静态成员变量初始化?

3 个答案:

答案 0 :(得分:3)

我认为你的意思是

// inside class definition block
static const int a = 0;
static int b = 0;       // error 

C ++标准9.4.2 / 4,

  

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

在标准中指定。

编辑:

正如M.M所指出的那样,以上引文实际上并不是标准所说的,而正确的引用是C++ Standard 12.2.3.2/3

  

如果非易失性非内联const静态数据成员是整数或枚举类型,则其声明   在类定义中可以指定一个大括号或者相等的初始化器,其中每个初始化子句都是一个   assignment-expression是一个常量表达式(8.20)。该成员仍应在命名空间范围内定义   如果它在程序中使用了odr-used(6.2),并且命名空间范围定义不包含初始化程序。一个   内联静态数据成员可以在类定义中定义,并且可以指定大括号或等于初始化程序。   如果使用constexpr说明符声明该成员,则可以在名称空间作用域中重新声明该成员,但不能   初始化程序(不推荐使用此用法;请参阅D.1)。其他静态数据成员的声明不得指定   大括号或相等的初始值设定。

答案 1 :(得分:1)

在内存中需要一点空间。 Const不 - 它们可以被硬编码。

答案 2 :(得分:-1)

类通常在头文件中声明。头文件可以在正文文件中多次包含。如果在类中定义了需要内存的静态成员,则在不同的正文文件中将存在此类成员的不同副本。这会破坏静态成员的想法。

另一方面,常量不使用内存,而且是纯编译结构。因此在课堂上宣布他们不会造成任何伤害。