Справочное руководство по Ada 95
3.3.1 Объявления объектов
Объявление object_declaration объявляет самостоятельный объект с заданным номинальным подтипом и, необязательно, явным начальным значением, заданным выражением инициализации. Для массива, задачи или защищённого объекта объявление object_declaration может включать определение (анонимного) типа объекта.
Синтаксис
object_declaration ::=
defining_identifier_list : [aliased] [constant] subtype_indication [:= expression];
| defining_identifier_list : [aliased] [constant] array_type_definition [:= expression];
| single_task_declaration
| single_protected_declaration
defining_identifier_list : [aliased] [constant] subtype_indication [:= expression];
| defining_identifier_list : [aliased] [constant] array_type_definition [:= expression];
| single_task_declaration
| single_protected_declaration
defining_identifier_list ::=
defining_identifier {, defining_identifier}
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 или полное определение типа объявления object_declaration определяет номинальный подтип объекта. Объявление object_declaration объявляет объект типа номинального подтипа.
Динамическая семантика
Если составной объект, объявленный объявлением object_declaration, имеет неограниченный номинальный подтип, то если этот подтип неопределён или объект является константой или алиасом (см. 3.10), фактический подтип этого объекта ограничен. Ограничение определяется границами или дискриминантами (если таковые имеются) его начального значения; объект называется ограниченным своим начальным значением. В случае алиасного объекта это начальное значение может быть явным или неявным; в других случаях требуется явное начальное значение. Когда объект не ограничен своим начальным значением, фактический и номинальный подтипы объекта одинаковы. Если его фактический подтип ограничен, объект называется ограниченным объектом.
Для объявления object_declaration без выражения инициализации все начальные значения для объекта или его подкомпонентов определяются неявными начальными значениями, определёнными для его номинального подтипа, следующим образом:
- Неявное начальное значение для подтипа доступа — нулевое значение типа доступа.
- Неявное начальное (и единственное) значение каждого дискриминанта ограниченного дискриминированного подтипа определяется подтипом.
- Для (определённого) составного подтипа неявное начальное значение каждого компонента с default_expression получается путём оценки этого выражения и преобразования в номинальный подтип компонента (что может вызвать Constraint_Error — см. 4.6, «Преобразования типов»), если компонент не является дискриминантом ограниченного подтипа (предыдущий случай) или не входит в исключённую variant (см. 3.8.1). Для каждого компонента, у которого нет default_expression, все неявные начальные значения определяются номинальным подтипом компонента.
- Для защищённого или задачного подтипа существует неявный компонент (очередь входа) для каждого входа, а его неявное начальное значение — пустая очередь.
Разработка объявления object_declaration выполняется в следующей последовательности шагов:
- 1.
- Сначала разрабатывается subtype_indication, array_type_definition, single_task_declaration или single_protected_declaration. Это создаёт номинальный подтип (и анонимный тип в последних трёх случаях).
- 2.
- Если объявление object_declaration включает выражение инициализации, явное начальное значение получается путём оценки выражения и его преобразования в номинальный подтип (что может вызвать Constraint_Error — см. 4.6).
- 3.
- Объект создаётся, и если нет выражения инициализации, все выражения для объекта или его подкомпонентов (см. 3.8) разрабатываются, а все неявные начальные значения для объекта или его подкомпонентов получаются в соответствии с номинальным подтипом.
- 4.
- Любые начальные значения (явные или неявные) присваиваются объекту или соответствующим подкомпонентам. Как описано в 5.2 и 7.6, могут вызываться процедуры Initialize и Adjust.
Для третьего шага создание объекта и все разработки и оценки выполняются в произвольном порядке, за исключением случаев, когда выражение по умолчанию для дискриминанта оценивается для получения его начального значения, тогда эта оценка выполняется до оценки выражения по умолчанию для любого компонента, зависящего от дискриминанта, а также до оценки любого выражения по умолчанию, которое включает имя дискриминанта. Оценки третьего шага и присваивания четвёртого шага выполняются в произвольном порядке, за исключением того, что каждая оценка выполняется до присваивания полученного значения.
Для скалярного подтипа не определено неявное начальное значение. При отсутствии явной инициализации только что созданный скалярный объект может иметь значение, которое не принадлежит его подтипу (см. 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 : Person_Name := new Person(Sex => M); -- см. 3.10.1
-- эквивалентно двум отдельным объявлениям объектов в указанном порядке
John : Person_Name := new Person(Sex => M);
Paul : Person_Name := new Person(Sex => M);
Paul : 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 : constant String := "Hi, world.";
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 : constant String := "Hi, world.";
Примеры объявления констант:
Limit : константа Целое := 10_000;
Low_Limit : константа Целое := Limit/10;
Tolerance : константа Вещественное := Dispersion(1.15);
Low_Limit : константа Целое := Limit/10;
Tolerance : константа Вещественное := Dispersion(1.15);