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

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

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

Синтаксис

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

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

Для объявления object_declaration с выражением expression после составного разделителя :=, ожидаемый тип для выражения 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_Value, — это значение этого аспекта, преобразованное к номинальному подтипу (что может вызвать Constraint_Error — см. 4.6, «Преобразования типов»);
  • Неявное (и единственное) значение для каждого дискриминанта ограниченного дискриминированного подтипа определено подтипом.
  • Для (определенного) составного подтипа неявное начальное значение каждого компонента с default_expression получается путём вычисления этого выражения и преобразования к номинальному подтипу компонента (что может вызвать Constraint_Error), за исключением случаев, когда компонент является дискриминантом ограниченного подтипа (предыдущий случай) или находится в исключённом variant (см. 3.8.1). Для каждого компонента, не имеющего default_expression, если составной подтип имеет аспект Default_Component_Value, неявное начальное значение — это значение этого аспекта, преобразованное к номинальному подтипу компонента; в противном случае неявные начальные значения определяются номинальным подтипом компонента.
  • Для защищенного или заданного подтипа существует неявный компонент (очередь ввода-вывода) для каждого входа с неявным начальным значением, представляющим пустую очередь.
Выполнение объявления 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 для любого компонента, зависящего от дискриминанта, предшествует присвоению этому дискриминанту.
  • Присваивания любым компонентам, включая неявные компоненты, не требующие поздней инициализации, предшествуют оценке начальных значений для любых компонентов, требующих поздней инициализации; если два компонента оба требуют поздней инициализации, то присваивания частям компонента, происходящие раньше в порядке объявлений компонента, предшествуют оценке начальных значений компонента, происходящего позже.
Для скалярного подтипа не определено неявное начальное значение, если для типа не указан аспект Default_Value. В отсутствие явной инициализации или указания аспекта Default_Value вновь созданный скалярный объект может иметь значение, которое не принадлежит его подтипу (см. 13.9.1 и H.1).
ПРИМЕЧАНИЯ
13 Неявные начальные значения не определены для неопределенного подтипа, потому что, если номинальный подтип объекта неопределенный, требуется явное начальное значение.
14 Как указано выше, автономный объект — это объект, объявленный с помощью object_declaration. Аналогичные определения применяются к «автономной константе» и «автономной переменной». Подкомпонент объекта не является автономным объектом, как и объект, созданный с помощью allocator. Объект, объявленный с помощью loop_parameter_specification, iterator_specification, parameter_specification, entry_index_specification, choice_parameter_specification, extended_return_statement или formal_object_declaration режима in out, не считается автономным объектом.
15 Тип автономного объекта не может быть абстрактным (см. 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