C 标准限制静态数据的初始化类定义中的成员仅限静态常量整型或枚举类型。
class A { static const int a = 3; // Allowed static int b = 3; // Error: Non-const static member cannot be initialized in class definition static const int c[2] = {1, 2}; // Allowed static int d[2] = {1, 2}; // Error: Non-const static array cannot be initialized in class definition };
This限制是由于编译器处理静态数据成员的方式造成的。每个静态数据成员必须有一个唯一的定义,如果在类定义中初始化,则当该类包含在多个翻译单元中时,它将创建多个定义。
静态数组,即使是常量数组,也无法在类定义中初始化,因为它们的大小无法在编译时确定。编译器要求先知道数组的大小,然后才能为数组分配内存。
要在类定义中初始化静态数组,可以使用以下解决方法可以使用“枚举技巧”:
class A { static const int a = 3; enum { arrSize = 2 }; static const int c[arrSize] = {1, 2}; };
标准的限制关于初始化非常量静态成员,源于防止定义不明确以及确保跨翻译单元的成员定义唯一的需要。
对于静态数组,C 语言设计优先考虑编译时效率,需要数组大小在编译时已知以优化内存分配。然而,C 11 引入了常量表达式的概念,允许使用编译时确定的值来初始化 const 数据成员,这可能会在未来的 C 版本中提供更多灵活性。
以上是为什么不能在 C 类定义中初始化非常量静态成员和数组?的详细内容。更多信息请关注PHP中文网其他相关文章!