3.8. ССЫЛОЧНЫЕ ТИПЫ

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

определение-ссылочного-типа ::= access указание-подтипа

Для каждого ссылочного типа существует литерал null, имеющий пустое ссылочное значение, вообще не указывающее объект. Пустое значение ссылочного типа — начальное значение этого типа по умолчанию. Другие значения ссылочного типа получаются вычислением специальной операции над типом, называемой генератором. Каждое такое ссылочное значение указывает объект подтипа, обозначенного указанием подтипа определения ссылочного типа; этот подтип называется указываемым подтипом; базовый тип этого подтипа называется указываемым типом. Указанные значением ссылочного типа объекты образуют набор, неявно связанный с типом.

Предвыполнение определения ссылочного типа состоит из предвыполнения указания подтипа и создания ссылочного типа.

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

Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, — это ограничения индексов и ограничения дискриминантов (см. разд. 3.6.1 и 3.7.2 для правил, применимых к этим указаниям подтипа). Ссылочное значение принадлежит соответствующему подтипу ссылочного типа, если либо ссылочное значение — пустое значение, либо если значение указываемого объекта удовлетворяет ограничению.

Примеры:

type FRAME is access MATRIX; -- см. 3.6 type BUFFERNAME is access BUFFER; -- см. 3.7.1

Примечание. Ссылочное значение, передаваемое генератором, может быть присвоено нескольким ссылочным объектам. Следовательно, объект, созданный генератором, может быть указан более чем одной переменной или константой ссылочного типа. Ссылочное значение может указывать только объект, созданный генератором, в частности, оно не может указывать объект, объявленный описанием объекта.

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

Ссылочные значения в некоторых других языках называются указателями или ссылками.

Ссылки: генератор 4.8, зарезервированное слово 2.9, имя 4.1, индексируемый тип 3.6, константа 3.2.1, лимитируемый тип 7.4.4, литерал 4.2, объект 3.2.1, ограничение 3.3, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, описание объекта 3.2.1, переменная 3.2.1, подкомпонента 3.3, подтип 3.3, Предвыполнение 3.9, принадлежит подтипу 3.3, присваивание 5.2, простое имя 4.1, спецификация индекса 3.6, тип 3.3, удовлетворять 3.3, указание подтипа 3.3.2.

3.8.1. НЕПОЛНЫЕ ОПИСАНИЯ ТИПОВ

Никаких конкретных ограничений на тип, указываемый ссылочным типом, не существует. В частности, тип компоненты указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или описания личного типа) для одного или нескольких типов.

неполное-описание-типа ::= type идентификатор [раздел-дискриминантов];

Для каждого неполного описания типа должно быть соответствующее описание типа с тем же идентификатором. Соответствующее описание должно быть либо полным описанием, либо описанием задачного типа. В оставшейся части главы пояснения даны в терминах полных описаний типа; те же правила применяются к описаниям задачного типа. Если неполное описание типа встречается непосредственно в разделе описаний или видимом разделе спецификации пакета, то полное описание типа должно встретиться позже непосредственно в этом разделе описаний или видимом разделе. Если неполное описание типа встречается непосредственно в личном разделе пакета, то полное описание типа должно быть позже непосредственно в самом личном разделе или же в разделе описаний соответствующего тела пакета.

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

Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел дискриминантов, то это Предвыполнение включает Предвыполнение раздела дискриминантов: в этом случае раздел дискриминантов полного описания типа не предвыпол-няется.

11 явно или неявно, прямо или косвенно. — Прим. ред.

Пример рекурсивного типа:

type CELL; — неполное описание типа type LINK is access CELL;type CELL is   record      VALUE : INTEGER;      SUCC : LINK;      PRED : LINK;  end record;HEAD : LINK := new CELL'(O, null, null); NEXT : LINK := HEAD.SUCC;

Примеры взаимозависимых ссылочных типов:

type PERSON(SEX : GENOER); — неполное описание типа type CAR; — неполное описание типаtype PERSONNAME is access PERSON; type CARNAME is access CAR;type CAR is    record       NUMBER : INTEGER;       OWNER : PERSONNAME;    end record;type PERSON(SEX : GENDER) is   record      NAME : STRING(1 .. 20);       BIRTH :  DATE; AGE : INTEGER range 0 .. 130;       VEHICLE : CAR_NAME;       casa SEX  is         when M => WIFE : PERSON_NAME(SEX => F);         when F => HUSBAND ; PERSON_NAME(SEX => M);      end case:end record;MYCAR, YOURCAR, NEXTCAR : CARNAME; — неявно инициированы — пустым значением

Ссылки: идентификатор 2.3, имя 4.1, компонента 3.3, обозначение типа 3.3.2, ограничение 3.3, ограничение дискриминанта 3.7.2, описание 3.1, определение ссылочного типа 3.8, предвы-полнение 3.9, раздел дискриминантов 3.7.1, согласован 6.3.1, ссылочный тип 3.8, тип 3.3, указание подтипа 3.3.2, указывать 3.8, элемент описания 3.9.

3.8.2. ОПЕРАЦИИ НАД ССЫЛОЧНЫМИ ТИПАМИ

Базовые операции над ссылочным типом включают присваивание, генераторы для этого ссылочного типа, проверку принадлежности, явное преобразование, квалификацию и литерал null. Если указываемый тип — тип с дискриминантами, то базовые операции включают именование соответствующих дискриминантов; если указываемый тип — именуемый тип, то они включают именование соответствующих компонент; если указываемый тип — индексируемый тип, то они включают образование индексируемых компонент и отрезков; если указываемый тип — задачный тип, то они включают именование входов и семейств входов. Кроме того, базовые операции включают образование именуемой компоненты с зарезервированным словом аll (см. 4.1.3).

Если указываемый тип — индексируемый тип, то базовые операции включают атрибуты с обозначениями FIRST, LAST, RANGE и LENGTH (и эти же атрибуты с параметром N для номера измерения). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики указываемого объекта (см. 3.6.2).

Если указываемый тип — задачный тип, то базовые операции включают атрибуты с обозначениями TERMINATED и CALLABLE (см. 9.9). Префикс каждого из этих атрибутов должен быть значением ссылочного типа. Эти атрибуты вырабатывают соответствующие характеристики задачных объектов.

Кроме того, атрибут T'BASE (см. 3.3.3) и атрибуты представления T'SIZE и T'STORAGE-SIZE (см. 13.7.2) определены для ссылочного типа или подтипа Т; атрибуты A'SIZE и A'ADDRESS определены для ссылочного объекта А (см. 13.7.2).

Кроме базовых операции над ссылочным типом включают предопределенное сравнение на равенство и неравенство.

Ссылки: атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, генератор 4.8, дискриминант 3.3, задачный тип 9.1, именуемая компонента 4.1.3, именуемый тип 3.7, индексируемая компонента 4.1.1, индексируемый тип 3.6, квалифицированное выражение 4.7, литерал 4.2, личный тип 7.4, набор 3.8, обозначение атрибута 4.1.4, объект 3.2.1, ограниченный индексируемый подтип 3.6, операция 3.3, отрезок 4.1.2, подтип 3.3, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, ссылочный тип 3.8, тип 3.3, указываемый подтип 3.8, указываемый тип 3.8, указывать 3.8.