Читаем Справочное руководство по C++ полностью

Конструкция выражение-размещения может содержать инициализатор-new. Для объектов классов с конструкторами (§R.12.1) задаваемый ею список параметров будет использоваться при вызове конструктора, в других случаях конструкция инициализатор-new должна иметь вид (выражение) или (). Если выражение присутствует, оно используется для инициализации объекта, если его нет, объект начнет существование с неопределенным значением.

Если класс имеет конструктор, объект этого класса можно создать с помощью new только при условии, что заданы подходящие параметры, или, что класс имеет стандартный конструктор (§R.12.1). Отводит ли память при создании объекта типа класс сама функция operator new, или оставляет это на конструктор, зависит от реализации. Как для конструктора, так и для функции operator new() проводится проверка возможности доступа и однозначности (§R.12).

Для массивов нельзя задавать инициализаторы. Массивы объектов типа класса с конструктором можно создавать с помощью операции new только, если конструктор класса является стандартным (§R.12.1). В этом случае стандартный конструктор будет вызываться для каждого элемента массива.

Инициализация производится только в том случае, когда функция operator new() возвращает ненуль. Если она возвращает 0 (пустой указатель), значение выражения есть 0.

Порядок вычисления выражения вызова operator new() для получения памяти и порядок вычисления параметров конструктора неопределен. Так же неопределено вычисляются ли параметры конструктора, если функция operator new() возвратила 0.

В конструкции имя-типа-new скобки использовать необязательно. Тогда обращение

new int (*[10])(); // error

может привести к ошибке, т.к. операции применяются в таком порядке

(new int) (*[10])(); // error

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

new (int (*[10])());

размещает массив из 10 указателей на функции (не имеющие параметров и возвращающие int).

Конструкции имя-типа-new в выражение-размещения должна быть самой длинной из возможных последовательностей конструкций описатель-new. Это предотвращает коллизии между операциями из описателей &, *, [] и их двойниками из выражения, например,

new int* i;   // syntax error: parsed as `(new int*) i'

              //               not s `(new int)*i'

Символ * используется в описателе указателя, а не в качестве операции умножения.

<p>R.5.3.4 Операция delete</p>

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

выражение-освобождения:

 ::opt delete выражение-приведения

 ::opt delete [] выражение-приведения

Результат имеет тип void. Операндом delete должен быть указатель, который возвращает new. Эффект применения операции delete к указателю, который не получен в результате операции new без задания параметры-new, считается неопределенным и обычно приводит к опасным последствиям. Однако гарантируется, что удаление по указателю с нулевым значением безопасно.

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

Нельзя удалять указатель на константу.

Операция delete вызывает деструктор (если он есть $$12.4) для объекта, на который настроен ее операнд.

Для освобождения памяти, отведенной под указываемый объект, операция delete вызывает функцию operator delete (§R.12.5). Для объектов, не имеющих тип класс (в том числе и для массивов классов), используется глобальная функция ::operator delete(). Для объекта типа класс T вызывается функция T::operator delete(), если она есть (используя обычные правила просмотра при поиске членов класса и производных от него классов, §R.10.1.1), в противном случае вызывается глобальная функция::operator delete(). Обращение ::delete гарантирует, что будет вызываться глобальная функция ::operator delete(), даже если существует T::operator delete(). Для удаления массивов используется обращение вида

delete [] выражение-приведения

Здесь выражение должно указывать на массив. Если есть деструкторы, они будут вызываться для удаления указанных объектов.

Результат удаления массива с помощью простого обращения delete неопределен, так же как и удаление одиночного объекта с помощью delete [].

<p>R.5.4 Явное преобразование типа</p>

Явное преобразование типа можно задать с помощью функциональной записи (§R.5.2.3) или с помощью операции приведения.

выражение-приведения:

 унарное-выражение

 (имя-типа) выражение-приведения

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

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных