为什么 C 坚持使用用户提供的默认构造函数来默认构造 const 对象
C 标准规定默认构造 const对象需要用户提供的默认构造函数。了解此要求背后的基本原理可以增强我们对 C 中对象初始化的掌握。
用户为常量对象提供的默认构造函数的目的
此要求的主要原因是为了确保对象在通过默认构造初始化时的有用性。如果该类缺少用户定义的构造函数,则它符合 POD(普通旧数据)类的资格。默认情况下,POD 类保持未初始化状态。因此,尝试初始化未初始化的 POD 类的 const 对象将产生一个几乎没有实际价值的对象。
POD 与非 POD 类
为了说明这一点概念,考虑没有用户定义构造函数的 struct POD:
struct POD { int i; }; POD p1; // uninitialized, but we can assign a value later POD p2 = POD(); // initialized const POD p3 = POD(); // initialized const POD p4; // error - uninitialized and cannot be modified
从代码中可以明显看出,未初始化的 POD 类可能会出现问题。但是,如果我们向类添加用户定义的构造函数,它就变成非 POD:
struct nonPOD_A { nonPOD_A() {} // this makes non-POD }; nonPOD_A a1; // initialized const nonPOD_A a2; // initialized
标准摘录和解释
C 标准指出“如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型。”这可以解释如下:
如果我们声明非 POD 类的 const 对象而不提供初始值设定项,则会自动调用默认构造函数。但是,如果该类是 POD,则该对象保持未初始化状态。因此,需要为 const 对象提供用户定义的默认构造函数可确保其正确初始化和有用。
结论
总之,C 需要用户提供的默认构造函数默认构造 const 对象,以保证该对象在创建时保持初始化状态并有用。在这种情况下,理解 POD 和非 POD 类别之间的区别至关重要。通过遵守此规则,C 确保通过默认构造初始化的 const 对象有效地达到其预期目的。
以上是为什么 C 需要用户定义的默认构造函数来默认构造常量对象?的详细内容。更多信息请关注PHP中文网其他相关文章!