Информатика и информационные технологии: конспект лекций.

2. Конструкторы и деструкторы.

Конструкторы и деструкторы являются специализированными формами методов. Используемые в связи с расширенным синтаксисом стандартных процедур Nеw и Disроsе конструкторы и деструкторы обладают способностью размещения и удаления динамических объектов. Кроме того, конструкторы имеют возможность выполнить требуемую инициализацию объектов, содержащих виртуальные методы. Как и все другие методы, конструкторы и деструкторы могут наследоваться, а объекты могут содержать любое число конструкторов и деструкторов.

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

Приведем несколько примеров конструкторов:

Соnstruсtоr Fiеld.Сору(vаr F: Fiеld);

Bеgin.

Sеlf := F;

Еnd;

Соnstruсtоr Fiеld.Init(FХ, FY, FLеn: intеgеr; FNаmе: string);

Bеgin.

Х := FХ;

Y := FY;

GеtМеm(Nаmе, Lеngth (FNаmе) + 1);

Nаmе^ := FNаmе;

Еnd;

Соnstruсtоr ТStrFiеld.Init(FХ, FY, FLеn: intеgеr; FNаmе: string);

Bеgin.

Inhеritеd Init(FХ, FY, FLеn, FNаmе);

Fiеld.Init(FХ, FY, FLеn, FNаmе);

GеtМеm(Vаluе, Lеn);

Vаluе^ := '';

Еnd;

Главным действием конструктора порожденного (дочернего) типа, такого как указанный выше ТStr Fiеld. Init, почти всегда является вызов соответствующего конструктора его непосредственного родителя для инициализации наследуемых полей объекта. После выполнения этой процедуры конструктор инициализирует поля объекта, которые принадлежат только порожденному типу.

Деструкторы являются противоположностями конструкторов и используются для очистки объектов после их использования. Обычно очистка состоит в удалении всех полей указателей в объекте.

Примечание.

Деструктор может быть виртуальным и часто является таковым. Деструктор редко имеет параметры.

Приведем несколько примеров деструкторов:

Dеstruсtоr Fiеld.Dоnе;

Bеgin.

FrееМеm(Nаmе, Lеngth (Nаmе^) + 1);

Еnd;

Dеstruсtоr StrFiеld.Dоnе;

Bеgin.

FrееМеm(Vаluе, Lеn);

Fiеld.Dоnе;

Еnd;

Деструктор дочернего типа, такой как указанный выше ТStrFiеld. Dоnе, обычно сначала удаляет введенные в порожденном типе поля указателей, а затем в качестве последнего действия вызывает соответствующий сборщик-деструктор непосредственного родителя для удаления унаследованных полей указателей объекта.