C++. Бархатный путь. Часть 1 - Выражение размещения

ОГЛАВЛЕНИЕ

Выражение размещения

ВыражениеРазмещения
::= [::] new [Размещение] ИмяТипаNew [ИнициализаторNew]
::= [::] new [Размещение] (ИмяТипа) [ИнициализаторNew]
Размещение ::= (СписокВыражений)
ИмяТипаNew ::= СписокСпецификаторовТипа [ОписательNew]
ОписательNew ::= * [СписокCVОписателей] [ОписательNew]
::= [ОписательNew] [Выражение]
ИмяТипа ::= СписокСпецификаторовТипа [АбстрактныйОписатель]
СписокСпецификаторовТипа ::=
СпецификаторТипа [СписокСпецификаторовТипа]
СпецификаторТипа ::= ИмяПростогоТипа
::= const
::= volatile
::= *****

Существуют также спецификаторы типа, обозначаемые нетерминальными символами СпецификаторКласса, СпецификаторПеречисления и УточнённыйСпецификаторТипа:

СпецификаторТипа ::= СпецификаторКласса
::= СпецификаторПеречисления
::= УточнённыйСпецификаторТипа

Об этих спецификаторах позже. Нетерминальный символ ИмяПростогоТипа представляет все известные в C++ имена основных типов. Кроме того, именами простого типа также считаются синтаксические конструкции, обозначаемые нетерминальными символами ПолноеИмяКласса и КвалифицированноеИмяТипа. Все эти имена строятся на основе идентификаторов, возможно, в сочетании с операцией ::.

ИмяПростогоТипа ::= ПолноеИмяКласса
::= КвалифицированноеИмяТипа
::= *****
ПолноеИмяКласса ::= КвалифицированноеИмяКласса
::= :: КвалифицированноеИмяКласса

Наконец мы можем описать, что собой представляет квалифицированное имя. Это система имён, разделённых операцией :: (обозначает класс, объявленный внутри другого класса).

КвалифицированноеИмя ::= КвалифицированноеИмяКласса :: Имя
КвалифицированноеИмяКласса ::= ИмяКласса
::= ИмяКласса::КвалифицированноеИмяКласса
КвалифицированноеИмяТипа ::= ОписанноеИмяТипа
::= ИмяКласса :: КвалифицированноеИмяТипа
ИмяКласса ::= Идентификатор
ОписанноеИмяТипа ::= Идентификатор
ИнициализаторNew ::= ([СписокИнициализаторов])
СписокИнициализаторов ::= [СписокИнициализаторов,] Инициализатор

Нетерминал АбстрактныйОписатель нам известен. Он используется для описания общей структуры объекта в тех случаях, когда имя объекта не играет никакой роли и может быть опущено. Например, в объявлениях.

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

При этом отводится память, необходимая для размещения объекта. Сам объект, возможно, инициализируется. После чего возвращается указатель на размещённый в динамической памяти объект.

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

При создании динамического массива (множества объектов одного типа, расположенных друг за другом в одной области динамической памяти), значением выражения размещения оказывается значение указатель на первый элемент массива. При этом соответствующий ОписательNew в квадратных скобках должен содержать информацию о размерах выделяемой области памяти. Естественно, выражение в квадратных скобках должно быть выражением целого типа. Никаких других ограничений на это выражение не накладывается.

…new int[25]…
…new int* [val1 + val2]…
…new float** [x]…