Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
31-40.doc
Скачиваний:
1
Добавлен:
24.09.2019
Размер:
140.29 Кб
Скачать

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

В состав любого класса входят два специальных метода -конструктор и деструктор. У класса TObject эти методы называются Сreate и Destroy, так же они называются в подавляющем большинстве его потомков.

Конструктор распределяет объект в динамической памяти и помещает адрес этой памяти в переменную self, которая автоматически объявляется в классе.

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

По своей форме конструкторы и деструкторы являются процедурами, но объявляются с помощью зарезервированных слов Сonstructor и Destructor:

type

TMyClass = class

IntField: Integer;

Constructor Create(Value: Integer);

Destructor Destroy;

end;

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

var

MyObject: TMyClass;

begin

MyObject.IntField := 0;

{ Ошибка! Объект не создан конструктором!}

MyObject := TMyClass.Create;

// Надо так: создаем объект

MyObject.IntField := 0;

// и обращаемся к его полю

MyObject.Free;

// Уничтожаем ненужный объект

end;

В базовом классе TObject определен метод Free, который сначала проверяет действительность адреса объекта и лишь затем вызывает деструктор Destroy. Обращение к деструктору объекта будет ошибочным, если объект не создан конструктором, поэтому для уничтожения ненужного объекта следует вызывать метод Free, как это сделано в предыдущем примере.

Большинство конструкторов реализуют некоторые действия, необходимые для правильной работы объекта. Поэтому в конструкторе класса-потомка следует сначала вызвать конструктор своего родителя, а уже затем осуществлять дополнительные действия. Вызов любого метода родительского класса достигается с помощью зарезервированного слова inherited (унаследованный):

Constructor TMyClass.Create(Value:Integer);

// Возможная реализация конструктора

begin

Inherited Create; // Вызываем унаследованный конструктор

IntField := Value; // Реализуем дополнительные действия

end;

Классификация конструкторов.

1.По инициализации состояния класса.

Инициализирующие конструкторы содержат отдельные значения, используемые для инициализации состояния полей экземпляра класса. В списке параметров может быть указан нуль, один или более параметров любых типов.

Один из инициализирующих конструкторов, имеющий пустой список параметров, имеет специальное наименование – пустой конструктор.

Пустой конструктор также инициализирует состояние экземпляра класса, используя для этого предопределенные значения (в соответствии с требованиями задачи).

Копирующий конструктор инициализирует состояние класса значением другого экземпляра этого класса (создает копию существующего экземпляра класса). В списке параметров указывается единственный параметр, имеющий тип «ссылка на экземпляр класса».