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
TObjecte vêm com o construtor sem parâmetrosCreate, 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.
