Элементарные сведения: описание, создание, инициализация
Предположим, что у нас есть следующие описания:
type Person_Name is new String (1 .. 4); type Person_Age is Integer range 1 .. 150;
type Person is record Name : Person_Name; Age : Person_Age; end record; |
Предположим также, что нам необходимо разместить экземпляр объекта типа Person
в области динамической памяти.
Для этого нам надо описать ссылочный тип, значения которого будут ссылаться на значения (объекты) типа Person и переменную этого ссылочного типа (заметим, что все ссылочные типы Ады описываются с помощью использования зарезервированного слова access):
type Person_Ptr is access Person; -- описание ссылочного типа Someone : Person_Ptr; -- переменная (объект) ссылочного типа |
Для индикации того, что переменная ссылочного типа (указатель) не указывает ни на один объект, Ада использует специальное значение null
(это подобно тому, что используется в языке Паскаль).
По умолчанию, объект ссылочного типа всегда инициализируется в null.
Таким образом, после приведенных выше описаний, переменная Someone
имеет значение null.
Теперь, чтобы создать объект типа Person в области динамической памяти и присвоить соответствующее ссылочное значение переменной Someone
необходимо выполнить следующее:
Someone := new Person; |
Примечательно, что созданный таким образом в области динамической памяти объект типа Person - никак не инициализирован.
Таким образом производится простое распределение пространства, которое необходимо для размещения объекта типа Person, в области динамической памяти.
После создания объекта в области динамической памяти, мы можем проинициализировать индивидуальные поля записи типа Person, на которую ссылается переменная Someone, следующим образом:
Someone.Name := "Fred"; Someone.Age := 33; |
Следует заметить, что при таком обращении к объекту в динамической области памяти производится неявная расшифровка ссылки, а внешний вид кода подобен тому, что используется при обращении к статическому объекту.
Для того, чтобы обратиться ко всему содержимому объекта, на который указывает значение ссылочного объекта (указателя), Ада использует зарезервированное слово all.
Кроме того, в подобных случаях, используются квалифицированные (указывающие имя типа) агрегаты:
Someone.all := Person'("Fred", 33); -- вариант с позиционным агрегатом Someone.all := Person'( Name => "Fred"; -- вариант с именованным агрегатом Age => 33 ); |
Однако, стоит обратить внимание на то, что использование агрегатов для инициализации всего объекта сразу - более удобно, а вариант с именованным агрегатом имеет лучшую читабельность (по сравнению с позиционным агрегатом), а это важно при работе со сложными структурами данных.
Ада позволяет одновременно создавать объект в динамической области памяти и выполнять его инициализацию требуемыми значениями.
Например, вместо выполненных ранее раздельно создания и инициализации, мы можем использовать следующее:
Someone := new Person'("Fred", 33); -- вариант с позиционным агрегатом Someone := new Person'( Name => "Fred"; -- вариант с именованным агрегатом Age => 33 ); |
Доступ к полям указываемого объекта |
a^.fieldname | *a.fieldname a->fieldname |
a.fieldname |
Копирование указателя | b := a; | b = a; | b := a; |
Копирование указываемого обекта |
b^ := a^; | *b = *a; | b.all := a.all |