Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВЕДЕНИЕ В ОБЪЕКТНО Ориентированное программиро...docx
Скачиваний:
19
Добавлен:
29.08.2019
Размер:
1.01 Mб
Скачать

Деструкторы объектов

Как было сказано ранее объекты, т.е. переменные типа класс, создаются путем вызова конструктора. В Object Pascal все переменные типа класс динамические, поэтому конструктор должен быть вызван явно. В допускающих статические переменные типа класс, для таких объектов вызов конструктора автоматически. В любом случае при вызове конструктора происходит распределение памяти поля объекта и инициализация параметров. А, как известно, распределенная память должна быть освобождена. Причем должна быть освобождена как память, занятая непосредственно полями объекта, так и им для своих целей динамическая память. Кроме того должны быть освобождены используемые объектом ресурсы, например файлы. Эти операции осуществляются с помощью деструкторов. Для динамических объектов деструкторы должны вызываться явно. Для статических, если такие, деструкторы будут вызваны автоматически при выходе из блока, где была объявлена переменная типа класс.

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

Например: destructor Destroy;

Хотя класс может иметь более чем один деструктор, рекомендуется для каждого класса иметь только один деструктор, именуемый Destroy.

Вызов деструктора осуществляется через тот объект, который должен быть уничтожен (а не класс как в случае конструктора) Например:

Var

MyObject:TMyObject;

. . .

MyObject.Destroy;

При вызове деструктора в первую очередь выполняются операторы, описанные в деструкторе. Обычно они содержат освобождение динамической памяти, на которую ссылаются поля объекта, и освобождение ресурсов, которые были предоставлены объекту, например закрытие файлов. Затем освобождается память, распределенная под сам объект. В Object Pascal для уничтожения объектов рекомендуется использовать унаследованный метод Free, который первоначально проверяет указатель (не равен ли он nil), а затем вызывает Destroy.

Приведем пример Дополним описание класса стек из прошлых примеров деструктором.

1. Стек в массиве

TSObStack = class(TObject)

Stack:array[1..1000] of TElem;

Top:integer;

Constructor Create; {по умолчанию}

Destructor Destroy;

procedure InStack(Elem: TElem}:boolean;

function OutStack(var Elem:TElem):Boolean;

end;

Constructor TSObStack .Create;

Begin

Top:=0; {можно было и не делать}

{конструктор по умолчанию не нужен}

End;

Destructor TSObStack.Destroy;

Begin

{никакие действия не нужны}

End;

2. Динамический стек

TDObStack=class(TObject)

Top:TERef;

Constructor Create; {по умолчанию}

Destructor Destroy;

procedure InStack(Elem: TElem}:boolean;

unction OutStack(var Elem:TElem):Boolean;

end;

Constructor TDObStack .Create;

Begin

Top:=nil; {можно было и не делать}

{ конструктор по умолчанию не нужен}

End;

Destructor TDObStack.Destroy;

Var

Elem:TElem;

Begin

While OutStack(Elem) do;

End;

Использование:

Var

DStack:TDObStack;

SStack:TSObStack;

. . .

A:TElem;

Begin

DStack:=TDObStack.Create;

SStack:=TSObStack.Create;

{использование}

DStack.Destroy;

SStack.Destroy

End.

В завершение рассмотрения конструкторов и деструкторов следует отметить следующее: если взять любую программу, написанную на Borland Pascal, использующую большое число стандартных визуальных компонент, которые являются объектами, вы почти не увидите там вызовов конструкторов и деструкторов. Дело в том, что любой компонент, попавший при визуальном проектировании в приложение из палитры компонентов, включается в определенную иерархию. Иерархия эта замыкается на форме: для всех ее составных частей конструкторы и деструкторы вызываются незримо для программиста. За создание и уничтожение самой формы отвечает приложение (глобальный объект с именем Application). В файле проекта (с расширением DPR.) вы можете увидеть вызов метода Application. CreateForm, предназначенного для выполнения этой цели. Что же касается объектов, создаваемых динамически (во время выполнения приложения), то здесь нужен явный вызов конструктора и деструктора или метода Free.