派生类构造函数初始值设定项列表中的基类默认构造函数

ont*_*cks 1 c++ constructor derived-class default-constructor

我见过很多次人们在派生类构造函数初始值设定项列表中添加基类的默认构造函数,如下所示

DerivedClass::DerivedClass(int x) : BaseClass(), member_derived(x)
{
    //Do something;
}
Run Code Online (Sandbox Code Playgroud)

派生类构造函数默认调用基类的默认构造函数。BaseClass()上面的初始化列表中的是多余的吗?

Swi*_*Pie 7

这取决于基类的声明。派生类的构造函数实际上初始化了基类。如果存在的话,它涉及默认构造函数调用。如果基类很简单,则不会对其进行初始化。考虑这段代码:

#include <iostream>

struct Base {
   int c;
};

class Derived : public Base {
public:
   Derived() : Base()
   {}
};

int main()
{
    Derived d;
    std::cout << d.c << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果您注释掉: Base(),您可能会收到编译器警告或打印随机值。

prog.cc: In function 'int main()':
prog.cc:17:20: warning: 'd.Derived::<anonymous>.Base::c' is used uninitialized [-Wuninitialized]
   17 |     std::cout << d.c << std::endl;
      |                    ^
prog.cc:16:13: note: 'd' declared here
   16 |     Derived d;
Run Code Online (Sandbox Code Playgroud)

在这种情况下: Base()确保值初始化Base