Конструкторы и деструкторы

Класс, экземпляр класса, конструктор, деструктор

В приведённом примере есть класс 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, чтобы избежать утечек памяти.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *