struct — инициализация структуры C ++ со всеми нулями

В 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);
}

1

Решение

Но мой вопрос также: если он инициализирует ноль для всех членов, это также относится к сложной структуре?

Да, все члены будут инициализированы, включая «сложный» элемент, но могут не инициализироваться нулем, конечный эффект определяется их типами.

Согласно вашему примеру кода, структура 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,

7

Другие решения

проблема

Будет ли это инициализировать всех членов к 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.

Рекомендации

cpprefrence

что такое агрегатная инициализация

Что означают следующие фразы в C ++: инициализация нуля, значения по умолчанию и значения?

глоссарий

Агрегированная инициализация :

Агрегатная инициализация — это форма инициализации списка, которая инициализирует агрегаты.

Инициализация значения:

Инициализировать значения

Это инициализация, выполняемая, когда переменная создается с пустым инициализатором.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector