什么是合成构造函数?

时间:2012-02-17 04:04:18

标签: c++ constructor

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

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

1 个答案:

答案 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