Constructores y destructores

Clase, instancia de clase, constructor, destructor

El ejemplo anterior incluye TAnimal y su subclase TDog. Una clase es simplemente un tipo, que se puede entender como una plantilla. La clase en sí no almacena ningún dato y no se asigna memoria al campo MyInt: Integer del ejemplo.

Aunque las variables de clase permiten que la propia clase contenga datos, no trataremos este punto ahora y solo explicaremos las clases normales con campos ordinarios.

Para asignar memoria a los campos debes crear una instancia de clase; crear una instancia requiere invocar un constructor.

Si nunca creas una instancia de una clase, su código es como si no existiera: no se ejecuta ni se asigna memoria a sus variables. Se puede comparar una clase con un molde: solo se reserva memoria cuando se usa, y cuando no se utiliza permanece sin consumir recursos.

Constructor

  • Método especial declarado con la palabra clave constructor;
  • El sistema asigna primero la memoria del objeto y luego ejecuta el código del constructor;
  • Todas las clases heredan implícitamente de TObject y traen un constructor sin parámetros Create disponible sin definirlo manualmente;
  • Los constructores personalizados son la mejor forma de inicializar objetos y permiten asignar valores iniciales a los campos;
  • Los constructores personalizados reciben convencionalmente el nombre Create.

Ejemplo

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; // Llamar primero al constructor padre
  InternalStuff := TObject.Create;
  Writeln('Ejecutar el constructor TAnimal.Create');
end;

destructor TAnimal.Destroy;
begin
  Writeln('Ejecutar el destructor TAnimal.Destroy');
  FreeAndNil(InternalStuff); // Liberar el subobjeto interno
  inherited Destroy; // Llamar al destructor padre al final
end;

var
  C: TAnimal;
begin
  C := TAnimal.Create;
  try
    // Usar el objeto
  finally
    FreeAndNil(C); // Invocar automáticamente el destructor Destroy
  end;
end.

Salida de ejecución

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
Ejecutar el constructor TMyClass.Create
Ejecutar el destructor TMyClass.DestroyLenguaje del código: CSS (css)

InternalStuff es un subobjeto contenido internamente por la clase. Se crea en el constructor y debe liberarse con FreeAndNil en el destructor para evitar fugas de memoria.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *