在类中初始化静态非常量成员和静态数组的困难
在 C 中,尝试直接在类定义中初始化非常量静态成员或静态数组经常导致编译器错误。本文探讨了这些限制背后的原因,并提出了实现所需功能的解决方法。
为什么我无法在类中初始化静态数据成员?
根据 C 标准,静态数据成员可以如果它们是 const 整型或枚举类型,则只能在类定义中进行初始化。此限制确保以下内容:
-
唯一定义:类定义通常包含在头文件中,头文件可以合并到多个翻译单元中。为了防止重复的对象定义,C 要求每个对象都有唯一的定义。需要内存存储的对象的类内初始化将违反此规则。
为什么只允许静态常量整型和枚举进行类内初始化?
- 对象存储:静态const整型成员被视为编译时常量,可以由编译器优化。通过允许它们的类内初始化,编译器可以消除将它们存储在内存中的需要,从而规避上述限制。
-
可执行性:允许枚举进行这种类内初始化,因为它们可以直接使用值来代替整数。
静态数组怎么样class?
静态数组的类内初始化是被禁止的,原因与静态非常量成员相同。此外,甚至不允许在类中初始化静态常量数组,因为:
-
有限常量:静态常量数组仅就其元素而言是常量,而不是其大小。这意味着编译器无法将它们视为编译时常量并有效地优化它们。
解决方法
要初始化类中的静态数组或非常量成员,可以使用以下技术使用:
-
枚举技巧:使用已定义常量的枚举数组大小和元素。
-
类外定义: 在命名空间范围内的类定义之外定义静态变量,允许非常量静态成员和静态数组初始化.
C 11 进化
C 11 通过允许初始化非静态来放宽限制类声明中的数据成员以及使用常量表达式初始化静态 const 文字成员。然而,这些功能可能尚未在所有编译器中得到支持。
以上是为什么C类中不能直接初始化静态非常量成员和静态数组?的详细内容。更多信息请关注PHP中文网其他相关文章!