C++ 实例创建顺序有何影响?

C++ How does order of instance creation matter?

我有一个 class 可以创建其他 class 的实例,当我调用它们时,编译器会警告我有关实例顺序的信息。为什么这有关系?无论顺序如何,它都做同样的工作。

例如我的核心 class 头文件中有这个(核心 class 处理游戏循环):

HUD hud;
World myWorld;

像这样他们做他们需要做的一切。但是编译器给出警告:

'Core::myWorld' will be initialized after [-Wreorder]|

然后,如果我将 myWorld 实例放在 hud 实例之上,它就不会再给我警告了。我只是想知道,它们的顺序到底有什么关系?

警告是因为,在构造函数初始化列表中,您在 HUD 之前初始化了 World,但实际上成员将按照它们在 class 中声明的顺序进行初始化。

只是一个小例子,它可能更糟:

class B
{
public:
   B(int i) : value(i) {}
private:
   int value;
};

class A
{
public:
   A() : value(10), b(value)
   {
   }
private:
   B b;
   int value;
};

此处 b 将在 value 之前初始化,因此,某些内容将被发送到 b 构造函数,而不是程序员想要的 10

struct C
{
    C() : p(std::make_unique<int>(42)), j(*p) {} // initialization doesn't use this order.

    // but the order here:
    int j;
    std::unique_ptr<int> p;
};

您将取消引用 nullptr,因为 jp 之前初始化。