Classe, instance de classe, constructeur, destructeur
L’exemple ci-dessus contient TAnimal et sa sous-classe TDog. Une classe n’est qu’un type, comparable à un modèle ; la classe elle-même ne stocke aucune donnée et aucune mémoire n’est allouée pour le champ MyInt: Integer de l’exemple.
Même si des variables de classe permettent à la classe de conserver des données, nous n’abordons pas ce point ici et ne traitons que les classes classiques à champs ordinaires.
Pour allouer de la mémoire aux champs, il faut créer une instance de classe ; créer une instance implique d’appeler un constructeur.
Si vous ne créez jamais d’instance d’une classe, son code est comme inexistant : il ne s’exécute pas et aucune mémoire n’est réservée pour ses variables. On peut assimiler une classe à un moule : la mémoire n’est allouée que lorsqu’on l’utilise, sinon elle reste inactive sans consommer de ressources.
Constructeur
- Méthode spéciale déclarée avec le mot-clé
constructor; - Le système alloue d’abord la mémoire de l’objet avant d’exécuter le code du constructeur ;
- Toutes les classes héritent implicitement de
TObjectet possèdent un constructeur sans paramètresCreate, utilisable sans définition manuelle ; - Les constructeurs personnalisés sont le meilleur moyen d’initialiser des objets, ils permettent d’affecter des valeurs initiales aux champs ;
- Les constructeurs personnalisés portent conventionnellement le nom
Create.
Exemple
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; // Appel du constructeur parent en premier
InternalStuff := TObject.Create;
Writeln('Exécution du constructeur TAnimal.Create');
end;
destructor TAnimal.Destroy;
begin
Writeln('Exécution du destructeur TAnimal.Destroy');
FreeAndNil(InternalStuff); // Libération du sous-objet interne
inherited Destroy; // Appel du destructeur parent à la fin
end;
var
C: TAnimal;
begin
C := TAnimal.Create;
try
// Utilisation de l'objet
finally
FreeAndNil(C); // Appel automatique du destructeur Destroy
end;
end.
Résultat d’exécution
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
Exécution du constructeur TMyClass.Create
Exécution du destructeur TMyClass.DestroyLangage du code : CSS (css)
InternalStuff est un sous-objet détenu en interne par la classe. Il est instancié dans le constructeur et doit être libéré via FreeAndNil dans le destructeur pour éviter les fuites de mémoire.
