В C ++, если я инициализирую структуру в форме «= {}», как в примере ниже, гарантирует ли она присвоение нулевых значений всем членам структуры?
Я понимаю, что это кажется дублирующим вопросом, но мой вопрос также таков: если он инициализирует ноль для всех членов, это также относится к сложной структуре?
Как структура внутри структуры, или для этого каждому члену должно быть явно присвоено нулевое значение в коде?
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
Редактировать: для ссылки на сложную структуру,
typedef struct scomplex{
s initial;
s t[5];
};
int main (void)
{
scomplex sc = {};
printf ("%d %d %d",sc.initial.i, sc.initial.x, sc.t[0].i);
}
Но мой вопрос также: если он инициализирует ноль для всех членов, это также относится к сложной структуре?
Да, все члены будут инициализированы, включая «сложный» элемент, но могут не инициализироваться нулем, конечный эффект определяется их типами.
Согласно вашему примеру кода, структура s
является агрегатным типом, то агрегатная инициализация выполняется.
(акцент мой)
Если количество пунктов инициализатора меньше, чем количество членов
and bases (since C++17)
или же список инициализаторов полностью пуст, остальные членыand bases (since C++17)
инициализируютсяby their default initializers, if provided in the class definition, and otherwise (since C++14)
по пустым спискам, в соответствии с обычным Список инициализация правила (которые выполняет инициализацию значений для не-классов и неагрегированных классов с конструкторами по умолчанию, а также для агрегатной инициализации для агрегатов).
Для этого случая член i
а также x
структуры s
будет значение инициализировано в ноль.
4) в противном случае объект инициализируется нулями.
Если структура s
имеет любые другие члены, они будут инициализированы (значение инициализировано или агрегировано инициализировано в соответствии с их типами) рекурсивно пустыми списками.
РЕДАКТИРОВАТЬ
Для вашего добавленного образца (структура scomplex
), член initial
будет значение инициализировано, и конечный эффект зависит от типа s
, И еще один член — это массив, который будет агрегат инициализирован с пустым списком, и все элементы массива будут инициализированы значением; То же, что член initial
, эффект зависит от типа s
,
Будет ли это инициализировать всех членов к 0?
typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {};
printf("%d %d", initial.i, initial.x);
}
Ответ: да. Доказательство? Вот Вы можете видеть, что это стало 0.
Это самоуверенный раздел. Но по моему мнению (ИМО), инициализируя его с {0}
будет более читабельным, чем {}
, так как он уведомляет пользователя о 0. Он фактически заполняется нулями.
s initial = {0};
Это называется Aggregate Initialization
как определил Дитер Люкинг, или Value Initialization
, как отметил songyuanyao. Это в основном форма инициализации, где вы можете инициализировать структуру со значениями, которые вы хотели бы. Например, давайте инициализируем его значением 1 вместо 0! Вы бы сделали:
// Example program
#include <stdio.h>
#include <iostream>typedef struct s{
int i;
bool x;
};
int main ()
{
s initial = {1,1};
printf("%d %d", initial.i, initial.x);
}
Вы можете увидеть это скомпилировано Вот. Как вы можете видеть выше, я делаю 1,1
которая является нормальной инициализацией. В отличие от инициализации 0, вы не можете просто инициализировать все части структуры так легко, как вы можете с 0.
что такое агрегатная инициализация
Что означают следующие фразы в C ++: инициализация нуля, значения по умолчанию и значения?
Агрегированная инициализация :
Агрегатная инициализация — это форма инициализации списка, которая инициализирует агрегаты.
Инициализация значения:
Инициализировать значения
Это инициализация, выполняемая, когда переменная создается с пустым инициализатором.