Страница 53 из 82
Выражение размещения ВыражениеРазмещения ::= [::] 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]… |