声明构造函数规则
构造函数与它的类同名。 任意数量的构造函数可以声明,这取决于重载函数规则。 (有关更多信息,请参见 重载。)
class-name ( argument-declaration-list )
备注
argument-declaration-list 能为空。
C++ 定义两个特殊构造函数,默认和复制构造函数,描述在下表中。
默认和复制构造函数
类型构造 |
参数 |
用途 |
---|---|---|
默认构造函数 |
可以调用没有参数 |
构造默认对象类类型 |
复制构造函数 |
可以采用单个参数对同一个类类型 |
复制类类型的对象 |
默认构造函数可以调用没有参数。 但是,在中,假定所有参数具有默认值,可以声明一个默认构造函数参数列表。 同样,复制构造函数必须接受单个参数对同一个类类型。 可以提供多个参数,提供所有后续参数的默认值为。
如果您没有提供任何构造函数,编译器尝试生成的默认构造函数。 如果您没有提供一个复制构造函数,编译器尝试生成一个。 这些编译器生成的构造函数被视为公共成员函数。 会生成错误,如果指定与对象而不是引用的第一个参数的复制构造函数。
一个编译器生成的默认构造函数将的对象 (初始化 vftables,并 vbtables,如上文所述),因此,它调用基类的默认构造函数和成员,但是,它不执行其他操作。 ,才会存在,可访问,并且明确,基类和成员构造函数调用。
一个编译器生成的复制构造函数设置一个新的对象并执行对象的内容的成员副本要复制的。 如果基类或成员存在构造函数,它们称为;否则,按位复制执行。
如果类 type 的所有基础和成员类具有接受 const 参数的复制构造函数,编译器生成的复制构造函数接受类型 const type的参数。 否则,编译器生成的复制构造函数接受类型 type的参数。
可以使用构造函数初始化 const 或 volatile 对象,但是,该构造函数不能声明为 const 或 volatile。 构造函数的唯一合法存储类是 内联;对于其他存储类修饰符的使用,包括 __declspec 关键字,与构造函数会导致编译器错误。
调用约定 stdcall 在静态成员函数和全局函数使用声明 __stdcall 关键字,因此,无法使用变量参数列表。 当您使用在非静态成员函数的 __stdcall 关键字,如构造函数,将使用 thiscall 调用约定的编译器”。
基类构造函数不受派生类继承。 当从派生类类型对象之后,它将是构造开始从基类元素;然后它移动到派生类元素。 编译器使用每个基类的构造函数整个对象的该部分初始化 (不包括在用例虚拟派生,如 初始化的基类所述)。