![](/img/trans.png)
[英]In C++, does a constructor that takes the base class count as a copy constructor?
[英]How does a constructor choose a base class constructor in C++
如果您在派生类的构造函数内部,并且没有对基类构造函数进行显式调用,则编译器如何知道要使用哪个基本构造函数?
如果构造函数初始化器列表中未提及基类,则将默认对其进行初始化 。 由于基类肯定是类类型的,这意味着将调用默认构造函数 。
这些引用中的两个还具有派生类的示例,这些派生类隐式调用基类的默认构造函数。 例如:
struct Class : public Base
{
unsigned char x;
unsigned char y;
Class ( int x )
: Base ( 123 ), // initialize base class
x ( x ), // x (member) is initialized with x (parameter)
y { 0 } // y initialized to 0
{} // empty compound statement
Class ( double a )
: y ( a+1 ),
x ( y ) // x will be initialized before y, its value here is indeterminate
{} // base class constructor does not appear in the list, it is
// default-initialized (not the same as if Base() were used, which is value-init)
...
};
它使用N4140 初始化基础和成员中的标准第§12.6.2[class.base.init] / 8(强调我的)中规定的默认构造函数:
在非委托的构造函数中,如果给定的可能构造的子对象未由mem-initializer-id指定(包括由于构造函数没有ctor-initializer而没有mem-initializer-list的情况),则
如果实体是具有大括号或相等初始化程序的非静态数据成员,并且
- 构造函数的类是一个联合,并且该联合的其他任何变体成员都不由mem-initializer-id或
- 构造函数的类不是联合体,并且,如果实体是匿名联合体的成员,则该联合体的其他任何成员都不会由mem-initializer-id指定 ,
该实体已按照8.5中的规定进行了初始化;
否则,如果实体是匿名联合或变量成员,则不执行初始化;
- 否则,实体是默认初始化的 。
请注意,根据特殊成员函数 §12[special] / 5,基类是潜在构造的子对象:
对于一个类,其非静态数据成员,其非虚拟直接基类,以及(如果该类不是抽象的)其虚拟基类称为其潜在构造的子对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.