Порядок инициализации конструктора и передача ссылок - PullRequest
3 голосов
/ 22 сентября 2011

Привет У меня есть вопрос о порядке инициализации конструктора. Дано ниже

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 ]

6 голосов
/ 22 сентября 2011

Они оба действительны, потому что A вообще не вызывает B.Если A получил доступ к элементу данных или функции-члена B, то это было бы неверно.В существующем случае A невозможно создать недопустимый пример.

0 голосов
/ 22 сентября 2011

просто пример, чтобы показать вам, когда что-то происходит

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...