Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OOP.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
293.89 Кб
Скачать

15. Конструкторы, перегрузка конструкторов, 16. Деструкторы

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

Конструктор — это специальный вид подпрограммы, присоединенный к классу. Его на-значение — создавать представителей (экземпляры) класса. Он ведет себя как функция, которая возвращает ссылку на вновь созданный экземпляр класса, т.е. на объект. Одновременно выделяется память для хранения значений полей экземпляра класса.

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

Синтаксис объявления конструкторов и деструкторов:

Type <имя класса>=Сlass[{Имя родительского класса>)] . . . Constructor Имя конструктора>[(<параметры>)]; [Override;] Destructor <имя деструктора>[(<параметры>)}; [Override;] End;

Примечания: • Объявляются конструкторы и деструкторы, как правило, в разделе Public класса. • В классе может быть объявлено несколько конструкторов, однако чаще бывает один конструктор. Общепринятое имя для единственного конструктора Create. • В одном классе может быть объявлено несколько деструкторов, но чаще бывает один деструктор без параметров (всегда!) с именем Destroy. • За объявлением деструктора по имени Destroy следует указывать ключевое слово-директиву Override, разрешающее выполнение предусмотренных по умолчанию действий для уничтожения экземпляра объекта, если при его создании возникла какая-либо ошибка. Фактически Override переопределяет метод предка • Метод Free так же удаляет (разрушает) экземпляры класса, предварительно проверяя их на Nil.

• Можно сказать, что конструктор является неявной функцией — он возвращает нового представителя того класса, который использовался при его вызове.

• Начиная с класса TComponent конструктор Create стал виртуальным и при его переопределении необходимо указывать слово-директиву Override.

//ПРО КОНСТРУКТОРЫ

Метод create – это конструктор – специальный метод, который можно применить к классу для выделения памяти под экземпляр данного класса. Экземпляр возвращается конструктором, и его можно присвоить переменной для хранения и дальнейшего использования объекта.

По умолчанию TObject.Create устанавливает все данные созданного экземпляра равными нулю. Если необходимо, чтобы экземпляр создавался с другими начальными данными, то нужно написать свой конструктор. Можно либо переопределить конструктор create, либо создать новый конструктор с любым именем, используя слово constructor. Рекомендуется использовать стандартное имя create. При создании нового конструктора не нужно обращаться к TObject.Create, так как память выделяется Delphi.

Конструктор Create обращается к методу класса InstanceSize для определения размера необходимой для размещения объекта памяти. Затем он запрашивает область памяти необходимого размера, используя процедуру NewInstance и инициализирует нулевыми значениями, используя процедуру InitInstance, а в качестве результата возвращает адрес области памяти Пример. TDate = class public constructor Create (y,m,d:integer); … constructor TDate.Create (y,m,d:integer); begin FDate:=Date(y,m,d) end;

В Delphi также возможно переопределение конструктора. Т.е. можно создать несколько конструкторов, назвав их всех именем create.

Constructor <имя класса>.<имя конструктора>[(<параметры>)]; [<блок обьявлений>} Begin Inherited <имя конструктора>[(<параметры>)}; //для наследуемых конструкторов <инициализация собственных полей> End;

ДЕСТРУКТОРЫ

Аналогично конструкторам, можно определить собственный деструктор класса – метод, объявляемый при помощи ключевого слова destructor и имеющий имя destroy. Деструктор обычно производит освобождение ресурсов перед уничтожением объекта. При разрушении собственного деструктора в класс добавляется код, который будет выполнен перед уничтожением объекта. В собственный деструктор не следует добавлять операции, связанные с освобождением памяти – все связанные с этим процедуры выполняются автоматически. Destroy – это виртуальный деструктор Класса TObject .

Большая часть классов переопределяет этот метод. Не рекомендуется определять другой деструктор класса. Дело в том, что объекты обычно уничтожаются при помощи метода Free, который в свою очередь обращается к виртуальному деструктору Destoy конкретного класса. Free – это метод класса TObject, наследуемый всеми остальными классами. Прежде чем обратиться к destroy, метод free проверяет, не равен ли текущий объект nil. Псевдокод:

procedure TObject.Free; begin if self <> nil then Destroy end;

Как видно из кода, обращение к методу Free не устанавливает ссылку на объект в nil. Поэтому это необходимо делать самостоятельно. Причина: объект не знает, какие именно переменные на него ссылаются. В версиях Delphi, начиная с пятой появилась процедура freeandnil.

procedure FreeAndNil (var Obj1); var P: TObject; begin P:= TObject (Obj1); P.Free; end;

////

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

Синтаксис реализации деструктора:

Destructor <имя класса>.<имя деструктора>[(<параметры>)}; [<блок объявлений>] Begin <уничтожение собственных полей> Inherited <имя деструктора>[{<параметры>)]; End;

Примечания: • Внутри деструктора есть доступ не только к обычным идентификаторам, но и к полям экземпляра класса, инкапсулированным при его определении. • Исполняемые операторы деструктора должны позаботиться обо всех операциях очистки, необходимых для уничтожения экземпляра класса. Код деструктора должен уничтожить все внутренние экземпляры объектов и освободить динамическую память, которая была зарезервирована во время существования экземпляра класса. Однако нет необходимости явно устанавливать в нулевые значения поля прямого доступа. • Необходимость в объявлении деструкторов с параметрами возникает очень редко. Обычно все, что нужно сделать деструктору — уничтожить экземпляр класса, и вся необходимая для этого информация и так доступна ему. • Если у класса нет полей косвенного доступа, то деструктор можно не создавать для такого пользовательского класса. • После вызова деструктора объект становится недоступен. Целесообразно присваивать объекту значение Nil сразу после его уничтожения, чтобы в дальнейшем можно было бы проверить его существование. • Не следует вызывать деструкторы непосредственно. Вызов метода Free, наследуемого от TObject.Free, сравнивает указатель экземпляра со значением Nil перед тем, как вызвать деструктор Destroy.

Вызовы конструкторов и деструкторов визуальных компонентов Delphi. Любой компонент, попавший в ваше приложение при визуальном проектировании, включается в определенную иерархию объектов, которая замыкается на форме (класс TFonn). Поэтому вызов конструкторов и деструкторов всех компонентов формы производится автоматически при инициализации и удалении формы, незримо для программиста.

Сами формы создаются и уничтожаются приложением — глобальным объектом с именем Application. В файле-проекте с расширением *.Dpr можно увидеть вызов конструктора формы в виде строки:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]