Инициализация структуры C ++

0

Есть ли разница между инициализацией структуры этими двумя способами:

structVar = {}

а также

structVar = {0}
  • 1
    Зависит от структуры.
Теги:
struct
initialization

2 ответа

4
Лучший ответ

исправленный

Если структура является совокупностью, то 2 определения выполняют одно и то же. Из стандарта С++ 11 (N3337):

8.5.1/7 Если в списке меньше предложений-инициализаторов, чем членов в совокупности, то каждый элемент, который явно не инициализирован, должен быть инициализирован из своего элемента-выравнивателя или, если нет скобки или -equal-initializer из пустого списка инициализаторов (8.5.4).

Если структура содержит два члена, например

struct S
{
    int x;
    double y;
};

то structVar = {} будет инициализировать элементы-члены, то есть они станут нулевыми (или если члены не являются POD, будет вызываться по умолчанию ctor).

Строка structVar = {0} будет инициализировать только первый член структуры с нулем. Поскольку в этом случае у вас есть совокупность, остальные члены инициализируются по пустым спискам, поэтому у вас есть

structVar = {0, {} };

В С++ 14 была добавлена возможность агрегатной инициализации для агрегатов, содержащих элементы с равными или равными значениями, т.е.

struct S
{
    int x;
    double y{1.1}; // or double y = 1.1;
}

В этом случае,

structVar = {0};

инициализирует x с 0 и y с 1.1. Это было невозможно до С++ 14.

PS: просто проверил код выше, clang++ компилирует его с помощью -std=c++1y, однако g++ 4.9.2 отклоняет его, даже если я скомпилирую с -std=c++14.

  • 0
    structVar = {0} инициализирует все оставшиеся элементы
  • 1
    @juanchopanza Я тоже пытаюсь это выяснить ... Из предоставленной мной ссылки кажется, что это верно только в C ++ 14, может быть, я что-то неправильно понимаю. остальные члены инициализируются их инициализаторами с фигурными или равными скобками, если они предусмотрены в определении класса , поэтому , если в классе нет инициализаторов с фигурными или равными скобками, то, по-видимому, остальные члены инициализируются по умолчанию. Странно, так как char a[10] = {'a'} выполняет инициализацию значения для остальных элементов массива ...
Показать ещё 4 комментария
5

Это действительно зависит от характера структуры.

Если это совокупность, они в основном эквивалентны. Однако первый из них является общим в том смысле, что он просто value-инициализирует структуру. Второй требует, чтобы первый элемент структуры был инициализирован с помощью 0 и инициализировал остальные элементы, как если бы каждый из них инициализировался пустым инициализатором {}, другими словами,

structVar = {0, {}, {}, {}, ..... };

поэтому каждый оставшийся элемент инициализируется значением.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню