什么是合成构造函数

What is a synthesized constructor?

本文关键字:构造函数 什么      更新时间:2023-10-16

它是什么?我有一个模糊的理解,合成构造函数是编译器隐式创建的构造函数,它也初始化其成员类对象,但可能满足也可能不满足程序实现的需要。这个定义正确吗?

在什么情况下,它会被合成,在哪些情况下,不会?

下面的文章比我更好地回答了你的问题。我引用了这篇文章中的一段简短的话,让你了解一下它的味道。报价下方会显示一个链接。

顺便说一句,我引用的"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