Construtores e destrutores

Classe, instância de classe, construtor, destrutor

O exemplo acima contém TAnimal e sua subclasse TDog. Uma classe é apenas um tipo, podendo ser entendida como um modelo. A própria classe não armazena dados e nenhuma memória é alocada para o campo MyInt: Integer do exemplo.

Apesar de variáveis de classe permitirem que a classe retenha dados, não abordaremos esse tópico por enquanto e trataremos apenas classes com campos comuns.

Para alocar memória nos campos, você deve criar uma instância de classe; criar uma instância exige a chamada de um construtor.

Se você nunca instanciar uma classe, seu código é praticamente inexistente: não será executado e nenhuma memória será reservada para suas variáveis. Compare uma classe a um molde: memória só é alocada quando utilizada, e sem uso ela permanece sem consumir recursos.

Construtor

  • Método especial declarado com a palavra-chave constructor;
  • O sistema aloca a memória do objeto primeiro, depois executa o código do construtor;
  • Todas as classes herdam implicitamente de TObject e vêm com o construtor sem parâmetros Create, utilizável sem escrita manual;
  • Construtores personalizados são a melhor forma de inicializar objetos, permitindo definir valores iniciais para os campos;
  • Construtores customizados são convencionalmente nomeados como Create.

Exemplo

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; // Chame o construtor da classe pai primeiro
  InternalStuff := TObject.Create;
  Writeln('Executar construtor TAnimal.Create');
end;

destructor TAnimal.Destroy;
begin
  Writeln('Executar destrutor TAnimal.Destroy');
  FreeAndNil(InternalStuff); // Liberar subobjeto interno
  inherited Destroy; // Chame o destrutor da classe pai no final
end;

var
  C: TAnimal;
begin
  C := TAnimal.Create;
  try
    // Utilizar o objeto
  finally
    FreeAndNil(C); // Chamar automaticamente o destrutor Destroy
  end;
end.

Saída da execução

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
Executar construtor TMyClass.Create
Executar destrutor TMyClass.DestroyCode language: CSS (css)

InternalStuff é um subobjeto mantido internamente pela classe. Ele é criado no construtor e deve ser liberado via FreeAndNil no destrutor para evitar vazamentos de memória.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *