13.6.1. Создание динамических объектов

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

VAR

ИмяСсылкиНаОбъект : ^ТипОбъекта;

- 287 -

Дальнейшее обращение к объектам и полям тоже будет обычным:

ИмяСсылкиНаОбъект — ссылка на объект,

ИмяСсылкиНаОбъект^ — объект в целом,

ИмяСсылкиНаОбъект^.ИмяПоля— поле данных объекта, ИмяСсылкиНаОбъект^.ИмяМетода — вызов метода объекта.

Динамические объекты могут создаваться стандартной процедурой New:

New( ИмяСсылкиНаОбъект );

Как и обычно, процедура New выделяет в динамической памяти область для хранения данных базового типа ссылки. Турбо Паскаль вводит некоторые расширения для динамического распределения и освобождения объектов. Если динамический объект содержит виртуальные методы, то он должен быть инициализирован с помощью вызова конструктора до вызова всех остальных его методов:

ИмяСсылкиНаОбъект^. ИмяКонструктора( параметры );

В Турбо Паскале процедура New расширена. Она позволяет в одной операции выделить память под объект и вызвать конструктор:

New( ИмяСсылкиНаОбъект, ИмяКонструктора( параметры ) );

Порядок действия такого вызова следующий. Сначала как бы выполняется операция New( ИмяСсылкиНаОбъект ). Если она завершилась успешно, то вызывается конструктор объекта. Иногда удобно описывать поля данных объекта тоже как динамические. В этом случае выделение памяти кучи для них должно происходить в конструкторе. И, конечно, в конструкторе должна происходить необходимая инициализация полей данных (в том числе и вызовы конструкторов для унаследованных полей). Связь экземпляра с таблицей VMT устанавливается самим фактом вызова конструктора. Разместить объект в куче можно также функцией New, возвращающей ссылку на объект. В этом случае параметр, передаваемый New — это тип ссылки на объект, а не сама переменная-ссылка:

TYPE

ТипСсылкиНаОбъект = ^ТипОбъекта;

VAR

ИмяСсылкиНаОбъект : ТипСсылкиНаОбъект;

BEGIN

ИмяСсылкиНаОбъект := New( ТипСсылкиНаОбъект );

...

END.

Точно так же, как и в процедурной форме, в функциональном

- 288 -

варианте New можно использовать второй параметр — имя конструктора типа объекта.