2011-09-22 58 views
3

嗨我有一个关于构造函数初始化顺序的问题。下面给出构造函数初始化顺序和引用传递

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

谢谢

回答

6

它们都是有效的,因为A根本不会调用B.如果A访问了B的数据成员或成员函数,那么这将是无效的。在现有的A的情况下,不可能产生无效的例子。

+0

干杯,谢谢。 – Cookie

+0

如果你想创建一个无效的例子,请将'A :: b'从引用改为对象。然后创建一个'D'将涉及一个未初始化对象的无效副本。 –

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 
+0

当您在struct D中更改A和B的顺序时,您将获得不同的输出,而与构造函数中的调用顺序无关。 –