Object Pascal использует так называемую ссылочную объектную модель. Это означает, что все объекты размещаются в памяти динамически, а объектные переменные фактически являются указателями на данные объекта в динамической памяти и имеют одинаковый размер (4 байта). Однако для доступа к данным объекта не используется символ разыменовывания ^ (записывается Man.fName, а не Man^.fName, хотя подразумевается именно второе). Для начального размещения объектов в динамической памяти служит особый вид методов, называемых конструкторами.
Чтобы объявить метод как конструктор, используется ключевое слово constructor. Оно записывается вместо слова procedure при определении метода в классе и при реализации метода (конструктор не может быть функцией). Компилятор автоматически добавляет к телу конструктора код, выделяющий в динамической памяти участок для полей объекта и обнуляющий этот участок. Так как конструктор необходимо выполнить перед использованием объекта, то в тело конструктора обычно помещают операторы инициализации объекта, например, задание начальных значений для полей. Отметим, что Object Pascal допускает существование в классе нескольких конструкторов. Традиционное (но не обязательное) имя для конструктора – Create.
Конструктор можно вызывать в виде имя-объекта.имя-конструктора, т. е. как обычный метод:
Man.Create;
Такой вызов означает простое выполнение тела конструктора (ре-инициализацию полей). Его можно применять только для тех объектов, которые уже размещены в памяти.
Если объект не используется, то занимаемая им динамическая память должна быть освобождена. Для уничтожения объектов предназначены особые методы – деструкторы.
Для объявления деструкторов используется ключевое слово destructor. Тело деструктора – подходящее место для финальных действий с объектом. Традиционное имя для деструктора – Destroy.
Добавим в класс TPerson деструктор:
type TPerson = class
. . .
constructor Create;
destructor Destroy;
end;
destructor TPerson.Destroy;
begin
fAge := 0;
fName := ''
end;
Теперь полный цикл работы с объектом Man выглядит следующим образом:
Man := TPerson.Create; // создание объекта
Man.fName := 'John Dow'; // работа с объектом
Man.Destroy; // уничтожение объекта
Деструктор можно вызвать только у инициализированного объекта. Попытка вызвать деструктор у неинициализированного объекта может привести к исключительной ситуации в работе программы.