Раздел 12.1 - Описание ссылочных типов
Часто полезно иметь переменную, которая, вместо того, чтобы содержать
некоторое значение, является ссылкой на какой-либо другой объект. В языке Аda
такие переменные называют ссылочными и, вообще говоря,
они эквиваленты указателям или ссылкам в других языках. Одним из наиболее
часто встречающихся применений ссылочных
переменных является реализация объектов переменного размера.
Для создания такой переменной сначала необходимо описать тип для нее;
такой тип называется ссылочным.
Ниже приведен пример описания ссылочного типа, позволяющего
переменным типа Node_Access получить доступ к
объектам типа Node (ссылаться на них):
type Node_Access is access Node;
Далее приведена BNF создания ссылочного типа для объекта:
описание_ссылочного_типа_для_объекта ::= "type" новое_имя_типа "is"
"access" ["all"] имя_типа ";"
Переменные ссылочного типа могут ссылаться на объект либо иметь
значение null. Можно создать ссылочную переменную со значением null,
используя ключевое слово "null" в качестве присваиваемого значения, а
также с помощью операций "=" или "/=" можно проверить, имеет ли переменная
значение "null". Вообще говоря, "null" можно считать значением,
которое может принимать переменная любого ссылочного типа.
Возможность "указывать" на другие значения может быть полезной и
эффективной, но также и опасной. С указателями легко сделать что-то не так
и получить неожиданные результаты. В Аda сделана попытка уменьшить
ущерб, который можно причинить, стремясь к эффективности. В Аda это
делается с помощью следующих правил:
-
Все ссылочные переменные инициализируются значением null (если
явно не указано другое инициализирущее значение).
-
Все операции, использующие значение, на которое указывает ссылочная
переменная, сначала проверяют, не равна ли она "null". Если это так, то
возбуждается исключение Constraint_Error.
-
Обычно ссылочные типы, используемые для получения доступа к объектам
могут быть ссылками только на ``динамически создаваемые'' объекты,
что мы сейчас и обсудим. Для того,
чтобы разрешить типу ссылаться на все объекты другого
типа, необходимо в его описание добавить ключевое
слово ``all''; такие ссылочные значения называются обобщенными
ссылочными объектами (нововведение Аda 95). Одним из применений обобщенных
ссылочных объектов является реализация интерфейсов с программами на C и C++,
так как обобщенные ссылочные объекты очень похожи на указатели в других языках.
Также важным является применение обобщенных ссылочных объектов в объектно-
ориентированном программировании, что будет обсуждаться ниже.
-
Для ссылочных переменных недопустимы арифметические операции. То же самое сделано
в Java и Pascal, в которых запрещена арифметика с указателями, в отличие от C и C++,
поддерживающих ее. Если вам это действительно необходимо, то в Аda существует
способ выполнения арифметических операций над указателями (см. пакет System в RM 13.7),
хотя в большинстве случаев такой подход нежелателен.
При оптимизации Ada-компилятор отбросит все эти проверки и
инициализации, если будет определено, что в них нет необходимости. Также
можно отключить их в конкретной подпрограмме, если известно, что она
полностью корректна.
Теперь, когда мы знаем, как описывать ссылочные типы, можно перейти к
рассмотрению их использования.
Упражнение:
Что из нижеследующего является объявлением ссылочного типа с именем
Thing_Access?
- type Thing_Access is access Thing;
- type access is Thing_Access;
- Thing_Access is access type;
Вы можете также:
David A. Wheeler (dwheeler@ida.org)
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s12s1.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org