Меня в основном смущает понятие различной инициализации в c ++, особенно в c ++ 11 стандарте.
Меня особенно смущает случай, когда объект создается через 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)
, можем ли мы прокомментировать
каково будет значение каждого поля в aptr->a1
, aptr->a2
, aptr->a3
?
какая инициализация инициируется во время этого процесса?
Дополнительная информация: возникает путаницаиз примера, включенного в 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. Любой комментарий по этому поводу?