为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化

why initialization of static member variable is not allowed inside class but initialization of const static members is allowed?

本文关键字:初始化 静态成员 许静态 静态 变量 不允许 为什么      更新时间:2023-10-16

当我尝试在班级声明时初始化静态成员变量时,编译器会按预期丢弃错误,因为我们需要明确分配静态成员变量的空间。我认为这对于静态常量变量应该相同。但是令我惊讶的是,班级内部静态const成员变量的初始化很好。可以让我知道为什么不允许以相同方式允许普通静态成员变量初始化吗?

我假设您的意思是

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

C 标准9.4.2/4,

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

它是在标准中指定的。

编辑:

正如M.M指出的那样,上面的引号实际上不是标准所说的,正确的是C 标准12.2.3.2/3

如果非挥发性非内部const静态数据成员是积分或枚举类型,则其声明 在类上 分配表达是恒定表达式(8.20(。成员仍应在命名空间范围中定义 如果在程序中使用ODR(6.2(,并且名称空间范围定义不包含初始化器。一个 内联静态数据成员可以在类定义中定义,并可以指定支架或平等的限制器。 如果将成员使用constexpr规范仪声明,则可以在命名空间范围内重新编写,否 初始化器(此用法已弃用;请参见D.1(。其他静态数据成员的声明不得指定 撑杆或平等仪式。

一个人在内存中需要一点空间。const不会 - 它们可以硬编码。

类通常在标题文件中声明。标题文件可以多次包含在正文文件中。如果在类中定义了需要内存的静态成员,那么在不同的正文文件中将有其他成员的副本。这将杀死静态成员的想法。

另一方面,

常数不使用内存,而是仅编译的构造。因此,在班级中宣布它们不会造成任何伤害。