ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Category:

C++: агрегатная инициализация структур

Встречаются структуры с десятками полей. Например, в наборе функций Windows API полно таких структур. Зачастую такие структуры требуется передать в функцию в качестве аргумента. При этом поля следует инициализировать какими-то значениями, например, нулем.

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

Почитать об этом на сайте компании Microsoft:
https://docs.microsoft.com/ru-ru/cpp/c-language/initializing-aggregate-types
На справочном сайте по языкам Си и C++:
https://en.cppreference.com/w/cpp/language/aggregate_initialization

Посмотрим, как это выглядит на примерах.

Пример 1.
struct S
{
    int a;
    int b;
};

S s1;

cout << s1.a << endl; // ошибка
cout << s1.b << endl;
Здесь при компиляции (у меня компилятор среды «Visual Studio Community 2017», операционная система — Windows) получил ошибку:
error C4700: использована неинициализированная локальная переменная "s1"

Пример 2. (Здесь и далее показана только та строка из первого примера, которая исправлена.)
S s1 = {0, 0};
Это, конечно, сработает, но не решит проблемы, изложенной в начале поста, а именно: хотелось бы избежать прописывания в программе инициализации каждого поля структуры, так как при большом количестве полей ухудшается читабельность программы.

Пример 3.
S s1 = {};
Вот это — то, что нужно. При таком написании каждое поле структуры будет инициализировано нулем, потому что таково стандартное правило: в данном случае по умолчанию поля инициализируются нулем.

Пример 4. Что случается, если при инициализации указано меньше значений, чем полей в структуре?
S s1 = {1};
В данном случае единицей будет инициализировано первое поле, а второе — будет инициализировано нулем. Тогда следующий пример будет аналогом примера 3:
S s1 = {0}; // аналог S s1 = {};
В этом случае первое поле, как и указано, будет инициализировано нулем, а остальные поля будут инициализированы нулем потому, что для них значения не указаны.

Еще видел, как некоторые применяют следующий прием:
S s1;
memset(&s1, 0, sizeof(s1));
Да, это работает. Только зачем это нужно, если есть вышеприведенные способы?
Tags: Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments