C 中静态成员变量的初始化:为什么在类之外?
在 C 中,静态成员变量在类声明之外初始化。这种与更直观的类内初始化的偏差引起了开发人员的好奇心。这一设计决策背后有逻辑原因吗?
根本原因在于要求静态成员必须在一个翻译单元中定义。如果类内允许初始化,则可能会导致同一变量在不同的翻译单元中出现多个定义,从而违反了单一定义规则。
为了说明这一点,请考虑以下示例:
struct Gizmo { static string name = "Foo"; };
如果允许使用此代码,则将在包含此头文件的每个翻译单元中定义名称。这与单定义规则相冲突,该规则要求一个变量只能有一个定义。
但是,C 提供了一种语法糖,允许在声明中初始化整型静态成员:
struct Gizmo { static const int count = 42; };
只要表达式是 const 整型或枚举类型,可以在编译时求值,并且单个翻译单元中仍然存在不违反单一定义规则。例如:
// gizmo.cpp #include "gizmo.h" const int Gizmo::count;
以上是为什么要在类声明之外初始化 C 静态成员变量?的详细内容。更多信息请关注PHP中文网其他相关文章!