Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

8. Новые операции new, delete, операция расширения области видимости

1. Операция new

Идеология языка C++ предполагает, что каждый объект создаётся (объявляется) именно в том месте, где он нужен, и является работоспособным сразу после создания. Для этого каждый класс имеет определёный набор конструкторов - функций, которые должны автоматически запускаться при создании объекта (экземпляра данного класса) и инициализировать его члены . Конструкторы одного класса отличаются только количеством и типом передаваемых параметров, то есть явяются перегруженными функциями. В языке C++ им имеется адекватная замена malloc() - оператор new. Рассмотрим пример:

MyClass *mc = new MyClass(5);

В данном случае создаётся экземпляр класса MyClass, после чего с помощью его конструктора, принимающего в качестве параметра целое число (в данном случае, число 5), объект "инициализируется" этим числом. Адрес вновь созданного объекта присваивается указателю mc.

Важное отличие оператора new от функции malloc() заключается в том, что он возвращает значение типа "указатель-на-объект" (то есть MyClass *), в то время как функция malloc() - "указатель-на-что-угодно" (void *). Подобная типизация в C++ - не редкость, она строже, чем та, что используется в Си, и, следовательно, менее ошибкоопасна.

Операция new предназначена для создания объекта типа имя-типа. Этот тип должен быть типом объекта и функции нельзя размещать с ее помощью, хотя указатели на функции можно.

выражение-размещения:

::opt new параметры-new opt имя-типа-new инициализатор-new

::opt new параметры-new opt ( имя-типа ) инициализатор-new

параметры-new:

( список-выражений )

имя-типа-new:

список-спецификаций-типа описатель-new opt

описатель-new:

* список-спецификаций-cv opt описатель-new opt

имя-класса :: список-спецификаций-cv opt описатель-new opt

описатель-new opt [ выражение ]

инициализатор-new:

( список-инициализаторов opt )

Время жизни объекта, созданного с помощью new, не ограничивается областью видимости, в которой он был создан. Операция new возвращает указатель на созданный объект. Если объект является массивом, возвращается указатель на начальный элемент массива. Допускается, чтобы вызывалась функция operator new() с параметром нуль. В таком случае возвращается указатель на объект. При повторении таких вызовов будут возвращаться указатели на разные объекты.Для резервирования памяти операция new обращается к функции operator new(). При размещении объекта типа T ей в качестве первого параметра передается sizeof(T). Если с помощью операции new создается объект не типа класс (в том числе и массив объектов типа класс), то вызывается глобальная функция ::operator new(). Если с помощью new создается объект класса T, вызывается функция T::operator new(), если она существует (используя обычные правила просмотра при поиске членов класса и его базовых классов), иначе вызывается глобальная функция ::operator new(). Использование операции ::new() гарантирует, что будет вызываться глобальная функция ::operator new(), даже если существует T::operator new(). Если класс имеет конструктор, объект этого класса можно создать с помощью new только при условии, что заданы подходящие параметры, или, что класс имеет стандартный конструктор.Как для конструктора, так и для функции operator new() проводится проверка возможности доступа и однозначности.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]