一些简单的构造函数代码的解释

时间:2012-01-12 23:33:38

标签: c++ class constructor

如果我执行以下操作,我会对会发生什么感到困惑:

class a{
  int i;
public:
  a(){}
};

class b: public a{
};

int main(){
  b  b1;
}

由于类b没有构造函数,它使用什么构造函数?它是否使用a的默认构造函数?或者它自己的编译器生成了一个?

5 个答案:

答案 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的构造函数只是无意义。

恕我直言,了解这两个方面非常重要。