C 11 中的类内初始化:约束的转变
在 C 11 中,引入了一项重大更改,允许类内初始化非静态和非常量成员的初始化。在此之前,此类初始化仅限于类型有限的静态和 const 成员。
从历史上看,这些限制源于需要避免在对象声明中出现多个定义,这会违反链接器规则。然而,在 C 11 中,编译器承担了解决这些复杂性的重担,实现了灵活的类内初始化。
这一更改不仅消除了对 static 和 const 成员的限制,还将功能扩展到非- 静态成员。非委托构造函数现在可以使用大括号或等于初始化器来初始化非静态成员。
此外,C 11 标准的第 9.4.2 节允许使用以下方式对非常量静态成员进行类内初始化: constexpr 说明符。
这种转变的底层机制是编译器在内部处理定义的潜在重复。链接器不会直接受到影响,因为编译器确保只有一个实际定义存在。
虽然这种放宽提供了更大的灵活性,但它引入了程序员需要考虑的其他细微差别。如果为单个成员指定了多个初始值设定项,则定义控制哪个初始值设定项优先的规则。如果非默认构造函数提供替代值,它将覆盖类内初始化。
总体而言,C 11 中引入类内初始化增强了代码可读性,减少了对额外初始化代码的需求,并提供更一致的对象构造方法。
以上是类内初始化如何改变 C 11 对象构造?的详细内容。更多信息请关注PHP中文网其他相关文章!