Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

15. Использование оператора new для динамического резервирования памяти и инициализации объектов. Примеры использования.

Оператор new — оператор языка программирования C++, обеспечивающий выделение динамической памяти в куче. new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес выделенного участка памяти. Однако, если new не может выделить память в куче, то он передаст (throw) исключение типа std::bad_alloc. Это устраняет необходимость явной проверки результата выделения.

int* number = new int; // выделение динамической памяти под неициализированный объект типа int

int* num = new int(5); // выделение динамической памяти под инициализированный объект типа int

Где 5 – наше инициализированное число

int* mass = new int[5]; // выделение динамической памяти под неинициализированный массив объектов типа int. Где 5 озночает кол-во элементов массива.

int* mass = new int[5] { 9, 7, 5, 3, 1 }; // // выделение динамической памяти под инициализированный массив объектов типа int.

16. Инициализация и присваивание: понятие, различия, особенности. Списочная инициализация (list initialization). Инициализация по умолчанию (default initialization). Значение по умолчанию (default value).

int* intPtr = new int; // Безымянный, неициализированный объект типа int.

Инициализация присваивает объекту определенное значение в момент его создания. Значения переменных, использующиеся при инициализации могут быть абсолютно любыми сложными выражениями.

В С++ инициализация и присваивание являются совершенно разными операциями. Инициализация переменной происходит один раз при ее создании, а присваивание удаляет содержимое объекта и заменяет его новым.

Списочная инициализация

Использование {} для инициализации объекта было введено новым стандартом С++11. При использовании с переменными встроенного типа списочной инициализации получается важное преимущество: компилятор не позволит произвести инициализацию, если это может привести к потери информации.

int unitsSold1 = {0};//списочная инициализация int unitsSold2{0};//списочная инициализация

Инициализация по умолчанию. Значение по умолчанию

При определении переменной без инициализатора, происходит ее инициализация по умолчанию. Таким переменным присваивается значение по умолчанию. Это значение зависит от типа переменной.

Переменные, определенные вне тела функции, имеют значение по умолчанию 0. А переменные определенные в функции остаются неинициализированными, т.е. в них хранится мусор.

В текущей версии языка попытка копирования или получения доступа к переменной, которая неинициализирована, является ошибкой.

Инициализацию объекта типа класса контролирует разработчик этого класса, т.е. сам класс.

Класс String при создании объекта без инициализации создает объект, который содержит пустую строку. Некоторые классы требуют, чтобы любой объект был инициализирован явно.

int unitsSold = 0;

int unitsSold3(0);

string* ps1 = new string;//инициализация по умолчанию пустой строкой

string* ps2 = new string();//инициализация значением по умолчанию (пустой строкой)

int* pi1 = new int;//инициализация по умолчанию, значение *pi1 неопределено

int* pi2 = new int();//инициализация значением по умолчанию 0;

*pi2 = 0