C ++实例创建顺序如何重要?

时间:2015-09-11 12:18:24

标签: c++ class instance creation

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

E.g。我在我的核心类头文件中有这个(核心类处理游戏循环):

HUD hud;
World myWorld;

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

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

然后,如果我将myWorld实例放在hud实例之上,它就不再给我警告了。我只是想知道,它们究竟是以何种顺序发生的呢?

2 个答案:

答案 0 :(得分:4)

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

愚蠢的例子,可能更糟糕的地方:

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

答案 1 :(得分:0)

使用

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之前已初始化。