构造函数初始化顺序和引用传递

时间:2011-09-22 13:29:51

标签: c++ constructor

您好我对构造函数初始化顺序有疑问。见下文

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还没有建成,但是地址应该已经知道了,所以它应该是安全的吗?

由于

2 个答案:

答案 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