Конструкторы и деструкторы являются специализированными фор-
мами методов. Используемые в связи с расширенным синтаксисом
стандартных процедур New и Dispose, конструкторы и деструкторы
обладают способностью размещения и удаления динамических объек-
тов. Кроме того, конструкторы имеют возможность выполнить требуе-
мую инициализацию объектов, содержащих виртуальные методы. Как и
все другие методы, конструкторы и деструкторы могут наследовать-
ся, а объекты могут содержать любое число конструкторов и дест-
рукторов.
Конструкторы используются для инициализации вновь созданных
объектов. Обычно инициализация основывается на значениях, переда-
ваемых конструктору в качестве параметров. Конструктор не может
быть виртуальным, так как механизм диспетчеризации виртуального
метода зависит от конструктора, который первым совершил инициали-
зацию объекта.
┌────────────┐ ┌───┐ ┌────────────┐ ┌───┐
описание ───>│ заголовок ├──>│ ; ├──>│ блок ├──>│ ; ├─>
конструктора │конструктора│ └───┘ │подпрограммы│ └───┘
└────────────┘ └────────────┘
┌───────────┐ ┌─────────────┐
заголовок ────>│constructor├┬>│идентификатор├─┬────────────────>
конструктора └───────────┘│ └─────────────┘^│ ┌──────────┐ ^
│ ┌─────────────┐││ │ список │ │
└>│ уточненный ├┘└─>│формальных├─┘
│идентификатор│ │параметров│
│ метода │ └──────────┘
└─────────────┘
Приведем несколько примеров конструкторов:
constructor Field.Copy(var F: Field);
begin
Self := F;
end;
constructor Field.Init(FX, FY, FLen: integer; FName: string);
begin
X := FX;
Y := FY;
GetMem(Name, Length (FName) + 1);
Name^ := FName;
end;
constructor TStrField.Init(FX, FY, FLen: integer; FName:
string);
begin
inherited Init(FX, FY, FLen, FName);
Field.Init(FX, FY, FLen, FName);
GetMem(Value, Len);
Value^ := '';
end;
Главным действием конструктора порожденного (дочернего) ти-
па, такого как указанный выше TStrField.Init, почти всегда явля-
ется вызов соответствующего конструктора его непосредственного
родителя для инициализации наследуемых полей объекта. После вы-
полнения этой процедуры, конструктор инициализирует поля объекта,
которые принадлежат только порожденному типу.
Деструкторы ("сборщики мусора") являются противоположностями
конструкторов и используются для очистки объектов после их ис-
пользования. Обычно очистка состоит из удаления всех полей-указа-
телей в объекте.
Примечание: Деструктор может быть виртуальным и часто
является таковым. Деструктор редко имеет параметры.
Приведем несколько примеров деструкторов:
destructor Field.Done;
begin
FreeMem(Name, Length (Name^) + 1);
end;
destructor StrField.Done;
begin
FreeMem(Value, Len);
Field.Done;
end;
Деструктор дочернего типа, такой как указанный выше
TStrField.Done, обычно сначала удаляет введенные в порожденном
типе поля указателей, а затем в качестве последнего действия вы-
зывает соответствующий сборщик деструктор непосредственного роди-
теля для удаления унаследованных полей-указателей объекта.