Инициализация в С. Инициализация в С
Скачать 27.9 Kb.
|
Инициализация в С++ОглавлениеИнициализация в С++ 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/] |