为什么 C 需要用户提供的构造函数来默认初始化常量对象
C 标准规定,当默认初始化 a 的对象时const 限定类型,该类型必须具有用户提供的默认构造函数。这一要求是由于 C 中 POD(普通旧数据)概念和对象初始化之间的相互作用而产生的。
在 C 中,默认情况下会初始化非 POD 类的对象。但是,POD 是没有构造函数、验证器或析构函数的轻量级数据类型,默认情况下不会初始化。这是因为 POD 是为性能敏感的场景而设计的,在这些场景中,显式初始化更加高效。
初始化 const 限定类型的对象时,标准要求使用用户提供的构造函数来确保该对象可以已初始化。这是必要的,因为如果底层类是没有构造函数的 POD,则该对象将保持未初始化状态,使其无用。
考虑示例代码:
struct B { B() : x(42) {} int doSomeStuff() const { return x; } int x; }; struct A { A() {} // Why is this required? B b; // Just for illustration }; int main() { const A a; }
在此代码中,对象 a 是 const 限定的。如果 A 类没有用户提供的构造函数,它将被视为 POD。由于 POD 默认情况下未初始化,因此 a 将未初始化,从而使代码无效。
但是,A 类确实有一个用户提供的构造函数,这使其成为非 POD。因此,a 通过调用构造函数进行默认初始化,代码编译成功。
标准对用户提供的构造函数的要求是为了确保 const 限定类型的对象可以正确初始化和使用.
以上是为什么 C 中的 Const 对象需要用户定义的默认构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!