Класс, экземпляр класса, конструктор, деструктор
В приведённом примере есть класс TAnimal и его подкласс TDog. Класс — это просто тип данных, его можно рассматривать как шаблон. Сам класс не хранит никаких данных, память для поля MyInt: Integer из примера не выделяется.
Хотя с помощью переменных класса можно хранить данные прямо в классе, этот момент мы пока не затрагиваем, разберем только обычные классы с простыми полями.
Чтобы выделить память для полей, нужно создать экземпляр класса; для создания экземпляра вызывается конструктор.
Если не создавать экземпляр класса, его код словно не существует — он не запускается, память под его переменные не выделяется. Класс похож на форму для литья: память выделяется только при использовании, а в неактивном состоянии он не расходует ресурсы.
Конструктор
- Специальный метод, объявляемый ключевым словом
constructor; - Сначала система выделяет память под объект, потом выполняет код конструктора;
- Все классы неявно наследуют
TObject, у них есть стандартный безаргументный конструкторCreate, он работает даже без ручного объявления; - Пользовательский конструктор — лучший способ инициализировать объект, в нем можно задать начальные значения полям;
- Пользовательские конструкторы по соглашению называются
Create.
Пример кода
program Demo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;
type
TAnimal = class
private
InternalStuff: TObject;
public
constructor Create;
destructor Destroy; override;
end;
constructor TAnimal.Create;
begin
inherited Create; // Сначала вызываем конструктор родительского класса
InternalStuff := TObject.Create;
Writeln('Выполнение конструктора TAnimal.Create');
end;
destructor TAnimal.Destroy;
begin
Writeln('Выполнение деструктора TAnimal.Destroy');
FreeAndNil(InternalStuff); // Освобождаем внутренний дочерний объект
inherited Destroy; // В конце вызываем деструктор родителя
end;
var
C: TAnimal;
begin
C := TAnimal.Create;
try
// Работа с объектом
finally
FreeAndNil(C); // Автоматический вызов деструктора Destroy
end;
end.
Результат запуска
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
38 lines compiled, 0.1 sec, 68672 bytes code, 4260 bytes data
D:\fpcdemo>mydemo
Выполнение конструктора TMyClass.Create
Выполнение деструктора TMyClass.DestroyCode language: CSS (css)
InternalStuff — это внутренний дочерний объект класса. Он создаётся в конструкторе, а в деструкторе его обязательно нужно освободить через FreeAndNil, чтобы избежать утечек памяти.
