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

4.8 Распределители

Оценка распределителя создаёт объект и возвращает значение доступа, обозначающее этот объект.

Синтаксис

распределитель ::=
new указание_типа | new квалифицированное_выражение

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

Ожидаемый тип для распределителя должен быть единственным типом доступа к объекту с типом назначения D, таким образом, что либо D покрывает тип, определяемый меткой указание_типа или квалифицированное_выражение, либо ожидаемый тип является анонимным, а определяемый тип — D'Class.

Правила легальности

Инициализированный распределитель — это распределитель с квалифицированным_выражением. Неинициализированный распределитель — это распределитель с указание_типа. В указание_типа неинициализированного распределителя ограничение разрешено только в том случае, если метка_типа_подтипа обозначает нескомпонованый составной подтип; если нет ограничение, то метка_типа_подтипа должна обозначать определённый подтип.
Если тип распределителя — тип доступа к константе, распределитель должен быть инициализированным распределителем. Если тип назначения ограничен, распределитель должен быть неинициализированным распределителем.

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

Если тип назначения типа распределителя является элементарным, то подтип созданного объекта — это подтип назначения. Если тип назначения является составным, то созданный объект всегда ограничен; если подтип назначения ограничен, то он обеспечивает ограничение созданного объекта; в противном случае объект ограничен своим начальным значением (даже если подтип назначения не ограничен значениями по умолчанию).

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

Для оценки распределителя сначала выполняется разработка указание_типа или вычисление квалифицированного_выражения. Для оценки инициализированного распределителя создаётся объект указанного типа, а значение квалифицированного_выражения преобразуется в подтип назначения и присваивается объекту.
Для оценки неинициализированного распределителя:
  • Если тип назначения элементарный, создаётся объект указанного подтипа, и присваивается любое неявное начальное значение;
  • Если тип назначения составной, создаётся объект указанного типа с меткой, если таковая имеется, определяемой меткой метка_типа_подтипа указание_типа; любые ограничения для подкомпонентов объекта обрабатываются (см. 3.8), и любые неявные начальные значения для подкомпонентов объекта получаются, как определено в указание_типа, и присваиваются соответствующим подкомпонентам. Проверяется, что значение объекта принадлежит указанному подтипу. Если эта проверка не пройдена, генерируется Constraint_Error. Эта проверка и инициализация объекта выполняются в произвольном порядке.
Если созданный объект содержит какие-либо задачи, они активируются (см. 9.2). Наконец, возвращается значение доступа, обозначающее созданный объект.
ПРИМЕЧАНИЯ
24 Распределители не могут создавать объекты абстрактного типа. См. 3.9.3.
25 Если какая-либо часть созданного объекта контролируется, инициализация включает вызовы соответствующих процедур Initialize или Adjust. См. 7.6.
26 Как объясняется в 13.11, «Управление памятью'', память для объекта, выделенного распределителем, берётся из пула памяти (возможно, определённого пользователем). Исключение Storage_Error генерируется распределителем, если памяти недостаточно. Для явного возврата памяти могут использоваться экземпляры Unchecked_Deallocation.
27 Реализации разрешено, но не обязательно, предоставлять сборку мусора (см. 13.11.3).

Примеры

Примеры распределителей:
new Cell'(0, null, null) -- явно инициализирован, см. 3.10.1
new Cell'(Value => 0, Succ => null, Pred => null) -- явно инициализирован
new Cell -- не инициализирован
new Matrix(1 .. 10, 1 .. 20) -- указаны только границы
new Matrix'(1 .. 10 => (1 .. 20 => 0.0)) -- явно инициализирован
new Buffer(100) -- указан только дискриминант
new Buffer'(Size => 80, Pos => 0, Value => (1 .. 80 => 'A')) -- явно инициализирован
Expr_Ptr'(new Literal) -- распределитель для типа доступа к типу всего класса, см. 3.9.1
Expr_Ptr'(new Literal'(Expression with 3.5)) -- явно инициализирован


Spec-Zone.ru

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