首页 >后端开发 >C++ >为什么不能在 C 类定义中初始化非常量静态成员和数组?

为什么不能在 C 类定义中初始化非常量静态成员和数组?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-12 21:07:18525浏览

Why Can't Non-Const Static Members and Arrays Be Initialized Within a C   Class Definition?

为什么静态数据成员和数组不能在类定义中初始化

非常量静态成员

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn