构造函数初始化顺序和引用传递
问题描述:
嗨我有一个关于构造函数初始化顺序的问题。下面给出构造函数初始化顺序和引用传递
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之前获得初始化。但是D呢? b还没有建成,但地址应该已经知道了,所以它应该是安全的?
谢谢
答
它们都是有效的,因为A根本不会调用B.如果A访问了B的数据成员或成员函数,那么这将是无效的。在现有的A的情况下,不可能产生无效的例子。
答
只是一个样本,以显示你的时候的事情发生
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
+0
当您在struct D中更改A和B的顺序时,您将获得不同的输出,而与构造函数中的调用顺序无关。 –
干杯,谢谢。 – Cookie
如果你想创建一个无效的例子,请将'A :: b'从引用改为对象。然后创建一个'D'将涉及一个未初始化对象的无效副本。 –