Объявленный описанием объект создается предвыполнением этого описания и обозначается простым именем или некоторой другой формой имени. В противоположность этому существуют объекты, создаваемые вычислением генераторов (см. 4.8) и не имеющие простого имени. Доступ к такому объекту осуществляется посредством возвращаемого генератором ссылочного значения; говорят, что ссылочное значение указывает объект.
определение_ссылочного_типа : : = access указание_подтипа
Для каждого ссылочного типа существует литерал null, имеющий пустое ссылочное значение, вообще не указывающее объект. Пустое значение ссылочного типа - начальное значение этого типа по умолчанию. Другие значения ссылочного типа получаются вычислением специальной операции над типом, называемой генератором. Каждое такое ссылочное значение указывает объект подтипа, обозначенного указанием подтипа определения ссылочного типа; этот подтип называется указываемым подтипом; базовый тип этого подтипа называется указываемым типом. Указанные значением ссылочного типа объекты образуют набор, неявно связанный с этим типом.
Предвыполнение определения ссылочного типа состоит из предвыполнения указания подтипа и создания ссылочного типа.
Если ссылочный объект - константа, то ссылочное значение не может быть изменено и всегда указывает один и тот же объект. С другой стороны, значение указываемого объекта не обязательно остается одним и тем же (присваивание указываемому объекту допустимо, если указываемый тип не лимитируемый).
Единственные формы ограничения, которые допустимы после имени ссылочного типа в указании подтипа, - это ограничения индексов и ограничения дискриминантов (см. разд.3.6.1 и 3.7.2 для правил, применимых к этим указаниям подтипа). Ссылочное значение принадлежит соответствующему подтипу ссылочного типа, если либо ссылочное значение - пустое значение, либо значение указываемого объекта удовлетворяет ограничению.
Примеры:
type ОБРАМЛЕНИЕ is access МАТРИЦА; - - см. 3.6
type ИМЯ_БУФЕРА is access БУФЕР; - - см. 3.7.1
Примечание. Ссылочное значение, передаваемое генератором, может быть присвоено нескольким ссылочным объектам. Следовательно, объект, созданный генератором, может быть указан более чем одной переменной или константой ссылочного типа. Ссылочное значение может указывать только объект, созданный генератором, в частности, оно не может указывать объект, объявленный описанием объекта.
Если тип объектов, указанных ссылочными значениями, - индексируемый тип или тип с дискриминантами, то эти объекты ограничены либо границами массива, либо значениями дискриминантов, заданными неявно или явно соответствующими генераторами (см. 4.8).
Ссылочные значения в некоторых других языках называются указателями или ссылками.
3.8.1. Неполные описания типов
Никаких конкретных ограничений на тип, указываемый ссылочным типом, не существует. В частности, тип компонента указываемого типа может быть другим ссылочным типом или даже тем же самым ссылочным типом. Это позволяет вводить взаимозависимые и рекурсивные ссылочные типы. Их описания требуют предварительного неполного описания типа (или описания личного типа) для одного или нескольких типов.
неполное_описание_типа : : = | ||||
type идентификатор [раздел_дискриминантов]; |
Для каждого неполного описания типа должно быть соответствующее описание типа с тем же идентификатором. Соответствующее описание должно быть либо полным описанием, либо описанием задачного типа. В оставшейся части главы пояснения даны в терминах полных описаний типа; те же правила применяются к описаниям задачного типа. Если неполное описание типа встречается непосредственно в разделе описаний или видимом разделе спецификации пакета, то полное описание типа должно встретиться позже непосредственно в этом разделе описаний или видимом разделе. Если неполное описание типа встречается непосредственно в личном разделе пакета, то полное описание типа должно быть позже непосредственно в этом личном разделе или же в разделе описаний соответствующего тела пакета.
Раздел дискриминантов должен быть дан в полном описании типа тогда и только тогда, когда он дан в неполном описании типа; если разделы дискриминантов даны, то они должны быть согласованы (см. 6.3.1 для правил согласования). До конца полного описания типа использование имени, объявленного неполным описанием типа, допустимо только как обозначение типа в указании подтипа определения ссылочного типа; единственной формой ограничения, допустимой в указании подтипа, являются ограничения дискриминанта.
Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел дискриминантов, то это предвыполнение включает предвыполнение раздела дискриминантов: в этом случае раздел дискриминантов полного описания типа не предвыполняется.
Пример рекурсивного типа:
type ЯЧЕЙКА; - - неполное описание типа | ||||||
type СВЯЗЬ is access | ЯЧЕЙКА; | |||||
type ЯЧЕЙКА is | ||||||
record | ||||||
ЗНАЧЕНИЕ: INTEGER; СЛЕД: СВЯЗЬ; ПРЕД: СВЯЗЬ; | ||||||
end record; | ||||||
ГОЛОВА: СВЯЗЬ: = new ЯЧЕЙКА' (0, null, null); СЛЕДУЮЩИЙ: СВЯЗЬ: = ГОЛОВА. СЛЕД; |
Примеры взаимозависимых ссылочных типов:
type ПЕРСОНА (ПОЛ: РОД); - - неполное описание типа | ||||||
type АВТОМОБИЛЬ; | - - неполное описание типа | |||||
type ИМЯ_ПЕРСОНЫ is access ПЕРСОНА; | ||||||
record | ||||||
НОМЕР: INTEGER; ВЛАДЕЛЕЦ: ИМЯ_ПЕРСОНЫ; | ||||||
end record; | ||||||
type ПЕРСОНА (ПОЛ: РОД) is | ||||||
record | ||||||
ИМЯ: STRING (1..20) ; РОДИЛСЯ: ДАТА; ВОЗРАСТ: INTEGER range 0..130; МАШИНА: ИМЯ_АВТОМОБИЛЯ; | ||||||
end case; | ||||||
end record; МОЙ_АВТО, ВАШ_АВТО, СЛЕДУЮЩИЙ_АВТО: ИМЯ_АВТОМОБИЛЯ; - - неявно инициированы пустым значением |