#include <iostream>
class A
{
public:
    A() { std::cout << " A ctor" << std::endl; }
    A(int i) { std::cout << " A ctor i" << std::endl; }
    ~A() { std::cout << " A dtor" << std::endl; }
};
class B: public A
{
public:
    B() : A () { std::cout << " B ctor" << std::endl; }
    ~B() { std::cout << " B dtor" << std::endl; }
};
class C: public A
{
public:
    B _b;

    C() : _b (), A () { std::cout << " C ctor" << std::endl; }
    ~C() { std::cout << " C dtor" << std::endl; }
};
int main ()
{
    C c;
}

输出为:
A ctor
A ctor
B ctor
C ctor
C dtor
B dtor
A dtor
A dtor

初始化的顺序是什么。 list ?为什么,在init中。 C的列表,A的ctor在B的ctor之前调用?我认为输出应该是:
A ctor
B ctor
A ctor
C ctor
C dtor
A dtor
B dtor
A dtor

谢谢。

最佳答案

在初始化列表中编写初始化的顺序并不重要,初始化的顺序由其他规则独立于该列表确定:

  • 首先,初始化基类。这就是为什么在C的构造中首先调用基类构造函数A的原因。就像在构造该基类的普通对象时一样,在此步骤中构造了所有属于基类的东西(基类和成员变量都属于该基类)。
  • 然后,按照在类中声明它们的顺序初始化派生类的成员变量。因此,如果有多个成员变量,则声明它们的顺序将确定初始化它们的顺序。初始化列表的顺序并不重要。
  • 关于c++ - build 者命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3846890/

    10-11 16:12