这是什么?我有一个模糊的理解,即合成构造函数是由编译器隐式创建的构造函数,它也初始化其成员类对象,但可能满足也可能无法满足程序实现的需要。这个定义是否正确?
在什么情况下它会被合成,它是什么情况,不是?
答案 0 :(得分:3)
以下文章比以往任何时候都更好地回答了您的问题。我引用了文章的简短段落,让你了解它的味道。报价下方会显示一个链接。
顺便提一下,我引用的“C ++参考指南”声称其中有529页营养丰富的C ++信息;你可能想给它添加书签。
构造函数初始化对象。默认构造函数就是那个 可以在没有任何参数的情况下调用。如果没有用户声明 类的构造函数,如果类不包含const或 引用数据成员,C ++隐式声明默认构造函数 为了它。
这样一个隐式声明的默认构造函数执行 创建此类对象所需的初始化操作。 但请注意,这些操作不涉及初始化 用户声明的数据成员。
例如:
class C { private: int n; char *p; public: virtual ~C() {} }; void f() { C obj; // 1 implicitly-defined constructor is invoked }
C ++为C类合成了一个构造函数,因为它包含一个 虚拟成员函数。在构造时,C ++初始化一个隐藏的 数据成员称为虚拟指针,其中每个都是多态类 具有。此指针保存包含的调度表的地址 该类的所有虚拟成员函数的地址。
在 合成构造函数不初始化数据成员n和p, 它也不为后者指向的数据分配内存。 一旦obj,这些数据成员具有不确定的值 建造。这是因为合成的默认构造函数 仅执行所需的初始化操作 实现 - 而不是程序员 - 构造一个对象。
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15