您好我对构造函数初始化顺序有疑问。见下文
struct B {}
struct A
{
B& b;
A(B& b) : b(b) {}
}
struct C
{
B b;
A a;
C() : b(),a(b) {}
}
struct D
{
A a;
B b;
D() : a(b),b() {}
}
我知道C是有效的,因为b在a之前被初始化了。但D怎么样? b还没有建成,但是地址应该已经知道了,所以它应该是安全的吗?
由于
答案 0 :(得分:6)
它们都是有效的,因为A根本不会调用B。如果A访问了B的数据成员或成员函数,那么这将是无效的。在A的现有情况下,不可能产生无效的示例。
答案 1 :(得分:0)
只是一个示例,告诉您什么时候发生的事情
struct B {
B() {
print("struct B / constructor B", 1);
}
};
struct A
{
B& b;
A(B& b) : b(b) {
print("struct A / constructor with B", 1);
};
};
struct C
{
B b;
A a;
C() : b(),a(b) {
print("struct C / constructor C", 1);
};
void dummy()
{
print("dummy",1);
}
};
struct D
{
A a;
B b;
D() : a(b),b() {
print("struct D / constructor D", 1);
};
void dummy()
{
print("dummy",1);
}
};
int main(int argc, char* argv[])
{
D dTest;
dTest.dummy();
C cTest;
cTest.dummy();
}
---输出
struct A / constructor with B
struct B / constructor B
struct D / constructor D
dummy
struct B / constructor B
struct A / constructor with B
struct C / constructor C
dummy