我有一个创建其他类实例的类,当我调用它们时,编译器会向我发出有关实例顺序的警告。为什么这有关系?无论顺序如何,它都做同样的工作。
E.g。我在我的核心类头文件中有这个(核心类处理游戏循环):
HUD hud;
World myWorld;
像这样他们做他们需要做的一切。但编译器会发出警告:
'Core::myWorld' will be initialized after [-Wreorder]|
然后,如果我将myWorld实例放在hud实例之上,它就不再给我警告了。我只是想知道,它们究竟是以何种顺序发生的呢?
答案 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
,因为j
在p
之前已初始化。