// инициализированное
// числом 7
int* p3 = new int[100]; // размещает 100 (неинициализированных)
// чисел int
// ...
delete p1; // удаляет индивидуальный объект
delete p2;
delete[] p3; // удаляет массив
Если с помощью оператора
new
вы размещаете в памяти объекты встроенного типа, они не будут инициализированы, если не указан инициализатор. Если с помощью оператора
new
вы размещаете в памяти объекты класса, имеющего конструктор, то, если не указан инициализатор, будет вызван этот конструктор (см. раздел 17.4.4).
Оператор
delete
вызывает деструкторы каждого операнда, если они есть. Обратите внимание на то, что деструктор может быть виртуальным (раздел A.12.3.1).
A.5.7. Операторы приведения
Существуют четыре оператора приведения к типу.
Динамическое приведение обычно используется для навигации по иерархии классов, если указатель
p
— указатель на базовый класс, а класс
D
— производный от базового класса. Если операнд
v
не относится к типу
D*
, то эта операция возвращает число
0
. Если необходимо, чтобы операция
dynamic_cast
в случае неудачи не возвращала
0
, а генерировала исключение
bad_cast
, то ее следует применять к ссылкам, а не к указателям. Динамическое приведение — единственное приведение, опирающееся на проверку типов во время выполнения программы.
Статическое приведение используется для “разумных преобразований,” т.е. если операнд v может быть результатом неявного преобразования типа
T
(см. раздел 17.8).
Оператор
reinterpret_cast
используется для реинтерпретации комбинации битов. Его переносимость не гарантируется. Фактически лучше считать, что он является вообще не переносимым. Типичным примером реинтерпретации является преобразование целого числа в указатель, чтобы получить машинный адрес в программе (см. разделы 17.8 и 25.4.1).
Приведения в стиле языка С и функциональные приведения могут выполнить любое преобразование типа, которое можно осуществить с помощью оператора
static_cast
или
reinterpret_cast
в сочетании с оператором
const_cast
.
Приведений лучше избегать. Во многих ситуациях их использование свидетельствует о плохом стиле программирования. Исключения из этого правила представлены в разделах 17.8 и 25.4.1. Приведение в стиле языка С и функциональные приведения имеют ужасное свойство: они позволяют вам не вникать в то, что именно они делают (см. раздел 27.3.4). Если вы не можете избежать явного преобразования типа, лучше используйте именованные приведения.
A.6. Инструкции
Грамматическое определение инструкций языка C++ приведено ниже (opt означает “необязательный”).
инструкция:
объявление
{ список_инструкции opt }
<b>try</b>
{ список_инструкции opt } список_обработчиков выражение opt;
инструкция_выбора
инструкция_итерации
инструкция_с_метками
управляющая_инструкция
инструкция_выбора:
<b>if</b>
(условие) инструкция
<b>if</b>
(условие) инструкция else
инструкция
<b>switch</b>
(условие) инструкцияинструкция_итерации:
<b>while</b>
(условие) инструкция
<b>do</b>
инструкция while
(выражение);
<b>for</b>
(инструкция_инициализации_for условие opt; выражение opt) инструкцияинструкция_с_метками:
<b>case</b>
константное_выражение: инструкция
<b>default:</b>
инструкция
<b>identifier:</b>
инструкцияуправляющая_инструкция:
<b>break;</b>
<b>continue;</b>
<b>return</b>
выражение opt;
<b>goto</b>
идентификатор;список_инструкции:
инструкция список_инструкции opt
условие:
выражение
спецификатор_типа объявляемый_объект = выражение
инструкция_инициализации_for:
выражение opt;
спецификатор_типа объявляемый_объект = выражение;
список_обработчиков:
<b>catch</b>
(объявление_исключения) { список_инструкции opt } список_обработчиков список_обработчиков opt
Обратите внимание на то, что объявление — это инструкция, а присваивание и вызов функции являются выражениями. К этому определению следует добавить следующий список.
• Итерация (
for
и
while
); см. раздел 4.4.2.
• Ветвление (
if
,
switch
,
case
и
break
); см. раздел 4.4.1. Инструкция
break
прекращает выполнение ближайшей вложенной инструкции
switch
,
while
,
do
или
for
. Иначе говоря, следующей будет выполнена инструкция, следующая за последней в теле одной из перечисленных выше инструкций.
• Выражения; см. разделы A.5 и 4.3.
• Объявления; см. разделы A.6 и 8.2.