【发布时间】:2012-03-08 12:38:41
【问题描述】:
这是什么?我有一个模糊的理解,合成构造函数是由编译器隐式创建的构造函数,它也初始化其成员类对象,但可能会也可能不会满足程序实现的需求。这个定义正确吗?
在什么情况下会被合成,在什么情况下不会?
【问题讨论】:
标签: c++ constructor
这是什么?我有一个模糊的理解,合成构造函数是由编译器隐式创建的构造函数,它也初始化其成员类对象,但可能会也可能不会满足程序实现的需求。这个定义正确吗?
在什么情况下会被合成,在什么情况下不会?
【问题讨论】:
标签: c++ constructor
以下文章比以往任何时候都更好地回答了您的问题。我引用了这篇文章的简短段落,让您了解它的味道。引用下方会显示一个链接。
顺便说一句,我引用的“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
【讨论】: