C++ - 我应该在初始化列表中调用基类默认构造函数吗?

q09*_*987 15 c++ inheritance constructor

class A : public B
{
  ...
}

// case I : explicitly call the base class default constructor
A::A() : B()
{
  ...
}

// case II : don't call the base class default constructor
A::A() // : B()
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

案例II是否与案例I相同?

对我来说,我假设在案例II中没有调用base clasa B的默认构造函数.

谢谢

///更新///

class B
{
public:
    B()
    {
        cout << "B constructor" << endl;
    }
};

class A : public B
{
public:
    A()
    {
        cout << "A constructor" << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

//从VS2008输出

B constructor
A constructor
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

rer*_*run 22

在两种情况下都会调用基类构造函数.

这是一篇包含更多信息的文章的链接.


Naw*_*waz 8

如果基类构造函数不接受任何参数,则不需要在初始化列表中明确提及它.


Joh*_*itb 7

如果B没有用户声明的构造函数,则行为不同。相比:

struct SimpleAggregate {
  int a;
  float b;
};

struct ClassWrapper : SimpleAggregate {
  ClassWrapper() : SimpleAggregate() { }
};

ClassWrapper w;
Run Code Online (Sandbox Code Playgroud)

现在,w.a并且w.b保证为零。如果您不进行基类的显式初始化,它们将具有不确定的值。


您可能不知道,尽管有语法,上面的 使用SimpleAggregate()没有调用默认构造函数。它只是对基类进行值初始化(我们在 Stackoverflow 上有几个关于“值初始化”是什么的很好的答案),而不是调用默认构造函数,因为没有用户声明。

  • 这是一个如此“大”的差异。这个应该被接受作为答案。 (2认同)

Chr*_* A. 5

为了完成学习体验并加深理解,您可以开始稍微修改一下.例如,B没有默认构造函数时会发生什么?它甚至编译?像这样的其他细微修改将提供良好的学习体验.

也就是说,根据我的经验,这样做通常会更好

A::A() : B() { ... } 
Run Code Online (Sandbox Code Playgroud)

A::A() { ... } 
Run Code Online (Sandbox Code Playgroud)

因为前者更明确,它会让你思考基类初始化的真正含义.您可能会通过明确拼写出来来避免隐藏行为.