在C ++中,当你在下面看到的内容时,是否保证了构造的顺序?
Logger::Logger()
: kFilePath_("../logs/runtime.log"), logFile_(kFilePath_)
{
// ...
}
答案 0 :(得分:28)
是的,始终保证施工顺序。但是,它不能保证与对象在初始化列表中的显示顺序相同。
成员变量按它们在类主体中声明的顺序构造。例如:
struct A { };
struct B { };
struct S {
A a;
B b;
S() : b(), a() { }
};
首先构建 a
,然后b
。成员变量在初始化列表中出现的顺序无关紧要。
答案 1 :(得分:9)
构造顺序是类定义中声明的顺序。
如果ctor-initializer
中的排序不同,则不会影响构造顺序。您的编译器可能会对此发出警告。
见12.6.2 / 5(2003年措辞,名为[class.base.init]
):
非静态数据成员应为 按照他们的顺序初始化 在类定义中声明 (再次无论顺序如何 MEM-初始化)。