Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

3.3.1 Объявления объектов

Объявление object_declaration объявляет самостоятельный объект с заданным номинальным подтипом и, необязательно, явным начальным значением, заданным выражением инициализации. Для массива, задачи или защищенного объекта объявление object_declaration может включать определение (анонимного) типа объекта.

Синтаксис

object_declaration ::=
defining_identifier_list : [aliased] [constant] subtype_indication [:= expression];
| defining_identifier_list : [aliased] [constant] access_definition [:= expression];
| defining_identifier_list : [aliased] [constant] array_type_definition [:= expression];
| single_task_declaration
| single_protected_declaration
defining_identifier_list ::=
defining_identifier {, defining_identifier}

Правила разрешения имен

Для объявления object_declaration с выражением expression после составного разделителя := ожидается тип объекта. Это выражение называется выражением инициализации.

Правила допустимости

Объявление object_declaration без зарезервированного слова constant объявляет переменный объект. Если оно имеет subtype_indication или array_type_definition, которые определяют неопределенный подтип, то должно быть выражение инициализации.

Статическая семантика

Объявление object_declaration со зарезервированным словом constant объявляет константный объект. Если оно имеет выражение инициализации, то оно называется полным объявлением константы. В противном случае оно называется отложенным объявлением константы. Правила для отложенных объявлений констант приведены в разделе 7.4. Правила для полных объявлений констант приведены в этом подразделе.
Любое объявление, включающее список defining_identifier_list с более чем одним defining_identifier, эквивалентно последовательности объявлений, каждое из которых содержит один defining_identifier из списка, с остальной частью текста объявления, скопированным для каждого объявления в том же порядке, что и в списке. Остальная часть данного международного стандарта опирается на эту эквивалентность; объяснения даны для объявлений с одним defining_identifier.
subtype_indication, access_definition или полное определение типа в объявлении object_declaration определяет номинальный подтип объекта. Объявление object_declaration объявляет объект типа номинального подтипа.
Компонент объекта называется требующим поздней инициализации, если он имеет значение доступа к дискриминанту, ограниченное выражением для каждого объекта, или если его выражение инициализации включает имя, обозначающее текущий экземпляр типа или обозначающее дискриминант доступа.

Динамическая семантика

Если составной объект, объявленный с помощью object_declaration, имеет неограниченный номинальный подтип, то если этот подтип неопределенный или объект является константой, фактический подтип этого объекта ограничен. Ограничение определяется границами или дискриминантами (если таковые имеются) его начального значения; объект считается ограниченным своим начальным значением. При отсутствии ограничения начальным значением фактический и номинальный подтипы объекта совпадают. Если фактический подтип ограничен, объект называется ограниченным объектом.
Для объявления object_declaration без выражения инициализации любые начальные значения для объекта или его подкомпонентов определяются неявными начальными значениями, определенными для его номинального подтипа, следующим образом:
  • Неявное начальное значение для подтипа доступа - это нулевое значение типа доступа.
  • Неявное и единственное начальное значение для каждого дискриминанта ограниченного дискриминированного подтипа определяется подтипом.
  • Для (определенного) составного подтипа неявное начальное значение каждого компонента с default_expression получается путём вычисления этого выражения и преобразования в номинальный подтип компонента (что может вызвать Constraint_Error — см. 4.6, «Преобразования типов»), если компонент не является дискриминантом ограниченного подтипа (предыдущий случай) или не входит в исключенную variant (см. 3.8.1). Для каждого компонента, не имеющего default_expression, любые неявные начальные значения определяются номинальным подтипом компонента.
  • Для защищенного или задач подтипа существует неявный компонент (очередь входа), соответствующий каждому входу, с его неявным начальным значением, являющейся пустой очередью.
Выполнение объявления object_declaration происходит в следующей последовательности шагов:
1.
subtype_indication, access_definition, array_type_definition, single_task_declaration или single_protected_declaration сначала выполняется. Это создает номинальный подтип (и анонимный тип в последних четырёх случаях).
2.
Если объявление object_declaration включает выражение инициализации, явное начальное значение получается путём вычисления выражения и преобразования его в номинальный подтип (что может вызвать Constraint_Error — см. 4.6).
3.
Объект создается, и, если нет выражения инициализации, объект инициализируется по умолчанию. Когда объект инициализируется по умолчанию, любые ограничения для объекта (см. 3.8) выполняются, и любые неявные начальные значения для объекта или его подкомпонентов получаются, как определено номинальным подтипом. Любые начальные значения (явные или неявные) назначаются объекту или соответствующим подкомпонентам. Как описано в 5.2 и 7.6, могут вызываться процедуры Initialize и Adjust.
Этот абзац был удалён.
Для третьего шага выше, вычисления и присваивания выполняются в произвольном порядке, подчиняясь следующим ограничениям:
  • Присваивание любой части объекта предваряется вычислением значения, которое должно быть присвоено.
  • Вычисление default_expression, включающего имя дискриминанта, предваряется присвоением этому дискриминанту.
  • Вычисление default_expression для любого компонента, зависящего от дискриминанта, предваряется присвоением этому дискриминанту.
  • Присвоения любым компонентам, включая неявные компоненты, не требующие поздней инициализации, должны предшествовать вычислениям начального значения для любых компонентов, требующих поздней инициализации; если два компонента оба требуют поздней инициализации, то присвоения частям компонента, появляющегося раньше в порядке объявления компонентов, должны предшествовать вычислениям начального значения компонента, появляющегося позже.
END_OF_DOCUMENT_MARKER
Для скалярного подтипа не определено неявное начальное значение. В отсутствие явного инициализирования, недавно созданный скалярный объект может иметь значение, которое не принадлежит его подтипу (см. 13.9.1 и H.1).
ПРИМЕЧАНИЯ
7 Неявные начальные значения не определены для неопределенного подтипа, поскольку, если номинальный подтип объекта неопределён, требуется явное начальное значение.
8 Как указано выше, автономный объект — это объект, объявленный с помощью object_declaration. Аналогичные определения применяются к «автономной константе» и «автономной переменной». Подкомпонент объекта не является автономным объектом, также как и объект, созданный с помощью allocator. Объект, объявленный с помощью loop_parameter_specification, parameter_specification, entry_index_specification, choice_parameter_specification или formal_object_declaration, не называется автономным объектом.
9 Тип автономного объекта не может быть абстрактным (см. 3.9.3).

Примеры

Пример объявления нескольких объектов:
-- объявление нескольких объектов
John, Paul : not null Person_Name := new Person(Sex => M); -- см. 3.10.1
-- эквивалентно двум отдельным объявлениям объектов в указанном порядке
John : not null Person_Name := new Person(Sex => M);
Paul : not null Person_Name := new Person(Sex => M);
Примеры объявления переменных:
Count, Sum : Integer;
Size : Integer range 0 .. 10_000 := 0;
Sorted : Boolean := False;
Color_Table : array(1 .. Max) of Color;
Option : Bit_Vector(1 .. 10) := (others => True);
Hello : aliased String := "Hi, world.";
θ, φ : Float range -π .. +π;
Примеры объявления констант:
Limit : constant Integer := 10_000;
Low_Limit : constant Integer := Limit/10;
Tolerance : constant Real := Dispersion(1.15);
Hello_Msg : constant access String := Hello'Access; -- см. 3.10.2


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API