【问题标题】:What is a synthesized constructor?什么是合成构造函数?
【发布时间】:2012-03-08 12:38:41
【问题描述】:

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

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

【问题讨论】:

标签: c++ constructor


【解决方案1】:

以下文章比以往任何时候都更好地回答了您的问题。我引用了这篇文章的简短段落,让您了解它的味道。引用下方会显示一个链接。

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

【讨论】:

  • 那么,这里的“综合”是什么意思呢?构造函数是用什么合成的?我想知道“合成”这个词的用法,以了解它在构造函数上下文中的解释。
  • @Anumu:合成构造函数是不是你写的构造函数。在C#中,我们称它为“默认”构造函数。
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2012-04-16
  • 1970-01-01
  • 2018-01-29
  • 2013-12-16
相关资源
最近更新 更多