Виды и правила инициализации в C++
Рассмотрим следующий код:
struct Object
{
Object() : i{ 0 }
{
};
int i;
int j;
};
// ...
Object object_1;
Object object_2{};
Как я понимаю, происходит следующее:
- Поля объекта
object_1имеют следующие значения:i == 0,j == undefined value; - Поля объекта
object_2имеют следующее значения:i == 0,j == 0.
Все действительно так?
Я зачитал Стандарт, пытаясь понять логику различных видов инициализации в C++, но запутался окончательно. Буду очень благодарен, если кто-нибудь сможет доходчиво объяснить, какие виды инициализации существуют, и каким правилам эти виды подчиняются.
Ответы (1 шт):
Нет, здесь разницы между Object object_1; и Object object_2{}; нет. В обоих объектах j не инициализирован.
Разница появляется, когда конструктор по умолчанию либо сгенерирован компилятором, либо отмечен как =default в теле класса:
struct Object
{
// Здесь ничего не меняет:
// Object() = default;
int i = 42;
int j;
};
Здесь да, j инициализируется нулем только для Object object_2{};.
Я зачитал Стандарт, пытаясь понять логику различных видов инициализации
Я бы вот тут почитал: https://en.cppreference.com/w/cpp/language/value_initialization