首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在类中不允许初始化静态成员变量,但是允许初始化const静态成员?

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

Stack Overflow用户
提问于 2018-04-26 01:36:17
回答 3查看 352关注 0票数 0

当我试图在类内声明时初始化静态成员变量时,编译器正按预期抛出错误,因为我们需要显式地为类之外的静态成员变量分配空间。我认为静态const变量应该是相同的。但令我惊讶的是,类中静态const成员变量的初始化工作正常。请让我知道为什么不允许以同样的方式初始化普通的静态成员变量吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-26 01:44:28

一个人需要一点记忆空间。康斯特不-他们可以被硬编码。

票数 1
EN

Stack Overflow用户

发布于 2018-04-26 01:55:48

我猜你是说

代码语言:javascript
复制
// inside class definition block
static const int a = 0;
static int b = 0;       // error 

C++标准9.4.2/4,

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

它是在标准中规定的。

编辑:

正如M.M .指出的那样,上述报价实际上不是标准所规定的,正确的报价是C++标准12.2.3.2/3。

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

票数 3
EN

Stack Overflow用户

发布于 2018-04-26 02:09:22

类通常在头文件中声明。头文件可以在正文文件中包含多次。如果需要内存的静态成员是在类中定义的,那么在不同的主体文件中就会有这样一个成员的不同副本。这将扼杀静态成员的想法。

另一方面,常量不使用内存,而是只编译结构.因此,在类中声明它们不会有任何害处。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50033574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档