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