簡體   English   中英

構造函數初始化順序和引用傳遞

[英]Constructor initialization order and reference passing

嗨,我有一個關於構造函數初始化順序的問題。 如下所示

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還沒有建成,但地址應該已經知道了,所以它應該是安全的嗎?

謝謝

它們都是有效的,因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM