Главная страница
Навигация по странице:

  • uniform-инициализация (инициализация списком.).

  • Инициализация в С. Инициализация в С


    Скачать 27.9 Kb.
    НазваниеИнициализация в С
    Дата22.05.2022
    Размер27.9 Kb.
    Формат файлаdocx
    Имя файлаИнициализация в С.docx
    ТипДокументы
    #543337

    Инициализация в С++

    Оглавление


    Инициализация в С++ 1

    Ранее использовавшиеся формы инициализации (примеры): 1

    Пример 1. Инициализация простой переменной 1

    Пример 2. Инициализация массива 1

    Пример 3. Инициализация структуры 1

    Пример 4. Инициализация динамической переменной 1

    Виды инициализации в С++ 2

    1. Копирующая (инициализация копированием); 2

    2. Агрегатная инициализация. 2

    Пример 5. 2

    Пример 6. 2

    Пример 7. 2

    Пример 8. 3

    3. Прямая инициализация. 3

    Пример 9. 3

    Пример 10. 3

    Ранее использовавшиеся формы инициализации (примеры):

    Пример 1. Инициализация простой переменной


    int a = 5;

    Пример 2. Инициализация массива


    double Mas[4] = {0.25, 0.5, 0.75, 1.5};

    Пример 3. Инициализация структуры


    struct cmplx

    {

    float a;

    float b;

    };

    cmplx Num = {2.0, 4.5};

    Пример 4. Инициализация динамической переменной


    int *E=new int(7);

    Виды инициализации в С++

    1. Копирующая (инициализация копированием);


    Этот способ унаследован от С. Признаком такого способа является знак «=» после имени переменной при ее объявлении. Вышеприведенный пример 1 является ее типичным представителем.

    Важное свойство копирующей инициализации: если типы значений не совпадают, то выполняется последовательность преобразования. У последовательности преобразования есть определенные правила (часть из них – о неявных правилах преобразования типов – высылалась на ящик в прошлом семестре). Например, int a = 2.5.

    2. Агрегатная инициализация.


    Тоже наследница С. Она используется для агрегатных (составных, сборных, объединенных) типов данных, то есть таких типов данных, которые являются просто набором публичных элементов. Характерные примеры – массив, структура (см вышеприведенные примеры 2 и 3). Эта инициализация использует копирующую инициализацию для каждого составного элемента типа данных.

    Начиная с С++11, в ее синтаксисе можно пропускать знак равенства:

    double Mas[4]{0.25, 0.5, 0.75, 1.5};

    cmplx Num{2.0, 4.5};

    Если при агрегатной инициализации пропустить некоторые элементы в массиве значений, то соответствующим переменным присваивается значение ноль.

    Пример 5.


    double Mas[4]{0.25, 0.5};

    Значения элементов массива: Mas[0]=0.25, Mas[1]=0.5, Mas[2]=0, Mas[3]=0.

    Пример 6.


    struct Wget {

    int i;

    int j;

    };
    int main() {

    Wget Var = {1};

    return Var.j;

    }

    Программа вернет 0, т.к. при инициализации не было указано второе значение. Поэтому поле j обнулено.

    Пример 7.


    int Mas[100] = {};

    Все элементы массива имеют нулевое значение.
    Другое важное свойство агрегатной инициализации – возможность пропуска скобок.

    Пример 8.


    Что вернет программа?

    struct Wget

    {

    int i;

    int j;

    };
    struct Tget

    {

    Wget w;

    int k;

    };
    int main() {

    Tget t = {1, 2};

    return t.k;

    }

    Программа вернет ноль. Здесь в структуре Tget присутствует вложенный агрегатный тип данных (поле w типа Wget). В этом случае выполняется обход всех полей структуры, и {1, 2} оказывается эквивалентно {{1, 2}, 0}.

    3. Прямая инициализация.


    Появилась в С++98. Прямая инициализация использует тот же синтаксис, что и у вызова функции, и ту же логика, что и в других функциях С++. Признак прямой инициализации – круглые скобки.

    Пример 9.


    struct Wget

    {

    int i;

    int j;

    };
    Wget t(1, 2);
    При помощи этого же синтаксиса можно инициализировать встроенные типы вроде int, float, bool и проч.

    Пример 10.


    intb(3);// в переменной b значение 3

    boola(true);// в переменной a значение ИСТИНА

    floatc(3.14);// в переменной с значение 3.14

    При прямой инициализации не выполняется последовательность преобразования.

    • uniform-инициализация (инициализация списком.).

    Появилась в С++11, как попытка обеспечить единый механизм, работающий со всеми типами данных. Имеет два синтаксиса:

    прямой синтаксис (только фигурные скобки)

    int aa[4]{1, 2,3,4};

    синтаксис копирования (фигурные скобки со знаком равенства)

    intaa[4]={1, 2};

    Инициализация переменной с пустыми фигурными скобками указывает на инициализацию по умолчанию (переменной присваивается 0)

    intvalue{}; // инициализация переменной по умолчанию значением 0 (ноль)

    Т.е. uniform-реализация очень похожа на агрегатную, но использоваться может для любых типов данных.

    У инициализации списком есть полезное свойство: не допускаются преобразования, сужающие диапазон значений. Например, если для инициализации int использовать значение типа double, это является сужающим преобразованием, и такой код не компилируется:

    inti{2.0}; // ошибка!

    То же самое происходит, если агрегатный объект пытаться инициализировать списком элементов типа double. Это нововведение C++11, и оно вызывает больше всего ошибок при обновлении кода, написанного на более старых версиях языка. Это создаёт много работы при поддержке больших объёмов унаследованного кода.

    В текущий момент времени считается, что необходимо максимально использовать uniform-инициализацию.

    Еще более подробно об инициализации в С++ можно почитать, например, здесь: [https://habr.com/ru/company/jugru/blog/469465/]


    написать администратору сайта