c ++ 11 инициализация по умолчанию / инициализация значения / прямая инициализация - PullRequest
2 голосов
/ 11 октября 2019

Меня в основном смущает понятие различной инициализации в c ++, особенно в стандарте.

Меня особенно смущает случай, когда объект создается через new (релевантно или нет), и предоставляется список инициализаторов (который соответствует определяемому пользователем конструктору), и этот конструктор не инициализирует все члены (включая POD и другие классы).

Следующее демонстрируетмоя путаница.

class B
{
public:
    int b1;
    int b2;
};

class C
{
public:
    int c1;
    int c2;
    C()
    {
        c2 = 1234;
    }
};

class A
{
public:
    int a1;
    B a2;
    C a3;
    A(int a): a1(a){}
};

Теперь, если я напишу auto aptr = new A(5), можем ли мы прокомментировать

  1. каково будет значение каждого поля в aptr->a1, aptr->a2, aptr->a3?

  2. какая инициализация инициируется во время этого процесса?


Дополнительная информация: возникает путаницаиз примера, включенного в https://en.cppreference.com/w/cpp/language/zero_initialization

struct A
{
    int i;
    A() { } // user-provided default ctor, does not initialize i
};

struct B { A a; }; // implicitly-defined default ctor

std::cout << B().a.i << '\n'; // value-initializes a B temporary
                              // leaves b.a.i uninitialized in C++03
                              // sets b.a.i to zero in C++11
// (note that B{}.a.i leaves b.a.i uninitialized in C++11, but for 
// a different reason: in post-DR1301 C++11, B{} is aggregate-initialization,
// which then value-initializes A, which has a user-provided ctor)

, где инициализация значения B, кажется, запускает определенную инициализацию А (какая именно), которая устанавливает Ai. Любой комментарий по этому поводу?

1 Ответ

1 голос
/ 11 октября 2019

Каким будет значение каждого поля в aptr->a1, aptr->a2, aptr->a3?

  • aptr->a1 будет иметь 5: из-заA(int a): a1(a){} и вы передаете A(5).
  • aptr->a2 будет созданным по умолчанию (созданным компилятором) объектом B (т. Е. Агрегатным типом), имеющим b1 и b2 значение мусора.
  • aptr->a3 будет C объектом, созданным предоставленным вами конструктором по умолчанию (то есть C(){ c2 = 1234; }). Значение c1 в a3 будет иметь значение мусора, а c2 будет инициализировано с 1234.
...