如果我执行以下操作,我会对会发生什么感到困惑:
class a{
int i;
public:
a(){}
};
class b: public a{
};
int main(){
b b1;
}
由于类b
没有构造函数,它使用什么构造函数?它是否使用a
的默认构造函数?或者它自己的编译器生成了一个?
答案 0 :(得分:5)
有两个构造函数将被调用 - 第一个构造函数a
用于基类初始化,然后是构造函数b
。由于您没有为b
定义构造函数,因此编译器会为您生成一个默认构造函数。由于您的b
类没有任何需要构造的成员,因此该默认构造函数将为空。
答案 1 :(得分:4)
它有一个编译器生成的“默认”默认(零参数)构造函数和编译器生成的“默认”复制构造函数。如果您的编译器支持它,它还有一个编译器生成的“默认”移动构造函数。
答案 2 :(得分:1)
类b将有一个编译器生成的构造函数,它将依次调用。
的构造函数答案 3 :(得分:1)
class b
将有一个由编译器生成的默认构造函数。由于b
会继承a
,因此订单将首先构建a
,然后构建b
。
答案 4 :(得分:1)
由于类b没有构造函数,它使用什么构造函数?它是否使用默认构造函数?或者它自己的编译器生成了一个?
这比起初看起来有点棘手。
就C ++标准而言,当程序员没有明确指定构造函数时,类会使编译器生成的构造函数不带参数。从概念上讲,b
获得了这样一个默认构造函数,后者又调用了a
的构造函数。
在另一个层面上,在优化编译器中,构造函数都没有任何事情可做 - 它们可能(或可能不)被完全消除,并且即使作为空函数也“不存在”。所以 - 在这个级别 - 谈论b
的构造函数调用a
的构造函数只是无意义。