为什么类中不能初始化非常量静态成员或静态数组?
类中,静态数据成员可以仅当它们是常量且是整型时才被初始化。此限制源于 C 标准要求每个对象都有唯一的定义。
非常量静态成员初始化:
根据 C 标准 (C 03 9.4 .2),非常量类型的静态数据成员不能在类定义中初始化。下面的代码说明了这一点:
class A { static int b = 3; };
此代码违反了标准,并且会产生错误,因为静态成员 b 是非常量并尝试在类中初始化它。
静态数组初始化:
同样,静态数组不能在类定义中初始化,即使它们是常量。这是因为静态数组作为对象存储在内存中。因此,它们无法在类定义中初始化,因为这会违反唯一定义的要求。
class A { static const int c[2] = { 1, 2 }; };
此代码再次违反标准并会产生错误。
解决方法和原因:
在类中初始化静态数组的一种解决方法涉及使用“枚举”技巧,”如下:
class A { static const int a = 3; enum { arrsize = 2 }; static const int c[arrsize] = { 1, 2 }; };
禁止静态数据成员的类内初始化的原因与包含类声明的头文件通常包含在多个翻译单元中这一事实有关。为了避免链接器问题,C 要求每个对象都有唯一的定义。如果允许对内存驻留实体进行类内初始化,则该规则将被打破。
但是,在 C 11 中,该限制已在一定程度上放宽。如果静态数据成员是 const 文字类型,则可以在类定义中使用大括号或等于初始化程序对其进行初始化。此外,现在可以在声明时初始化非静态数据成员。这些功能尚未在所有编译器中完全实现,例如 gcc 4.7。
以上是为什么不能在 C 中的类定义内初始化非常量静态成员或静态数组?的详细内容。更多信息请关注PHP中文网其他相关文章!