构造函数是类的一种特殊的非静态成员函数,用于初始化该类类型的对象。
在类的构造函数定义中,成员初始化器列表指定各个直接和虚基类和各个非静态数据成员的初始化器。 (请勿与 std::initializer_list 混淆)
构造函数用下列形式的成员函数声明符声明:
其中 必须指名当前类(或类模板的当前实例化),或当在命名空间作用域或在友元声明中声明时,它必须是有限定的类名。
构造函数声明的 中仅允许说明符 、 及 (尤其是不允许返回类型)。注意 cv 及引用限定符也不受允许;const 与 volatile 语义对于构造过程中的对象无效果,直至最终派生类的构造函数完成才生效。
任何构造函数的函数定义的函数体,在复合语句的开花括号之前,可包含成员初始化器列表,其语法是冒号字符 后随一或多个 的逗号分隔列表,每项均具有下列语法
构造函数没有名字且无法被直接调用。它们在发生初始化时调用,且它们按照初始化的规则进行选择。无 说明符的构造函数是转换构造函数。有 说明符的构造函数令其类型成为字面类型 (LiteralType) 。可以不带任何实参调用的构造函数是默认构造函数。可以接收同类型的另一对象为实参的构造函数是复制构造函数和移动构造函数。
在开始执行组成构造函数体的复合语句之前,所有直接基类,虚基类,及非静态数据成员的初始化均已结束。成员初始化器列表是能指定这些对象的非默认初始化之处。对于不能默认初始化的基类或非静态数据成员,例如引用和 const 限定的类型的成员,必须指定成员初始化器。对没有成员初始化器的匿名联合体或变体成员不进行初始化。
指名虚基类的初始化器,在并非所构造对象的最终派生类的构造期间被忽略。
出现于 或 中的名字在构造函数的作用域中求值:
成员初始化器所抛出的异常可被函数 try 块处理。
成员函数(包括虚成员函数)可从成员初始化器调用,但若在该点所有直接基类尚未全部被初始化,则行为未定义。
对于虚调用(若在该点已初始化直接基类),适用与从构造函数与析构函数中进行虚函数调用相同的规则:虚成员函数表现如同 的动态类型是正在构造的类的静态类型(动态派发不在继承层级下传),而对纯虚成员函数的虚调用(但非静态调用)是未定义行为。
列表中的成员初始化器的顺序是不相关的:初始化的实际顺序如下:
(注意:如果初始化的顺序是由不同构造函数中的成员初始化器列表中的出现所控制,那么析构函数就无法确保销毁顺序是构造顺序的逆序了)
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/5489.html