2011-09-22 59 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的順序時,您將獲得不同的輸出,而與構造函數中的調用順序無關。 –