Klasse, Klasseninstanz, Konstruktor, Destruktor
Das obige Beispiel enthält TAnimal und seine Unterklasse TDog. Eine Klasse ist lediglich ein Typ, der als Schablone verstanden werden kann. Die Klasse selbst speichert keine Daten, für das Feld MyInt: Integer im Beispiel wird kein Speicher reserviert.
Zwar können Klassenvariablen der Klasse selbst Daten speichern, darauf gehen wir hier nicht ein und behandeln nur reguläre Klassen mit normalen Feldern.
Um Speicher für Felder zu reservieren, müssen Sie eine Klasseninstanz erstellen; das Erstellen einer Instanz erfordert den Aufruf eines Konstruktors.
Wenn Sie niemals eine Instanz einer Klasse erstellen, existiert ihr Code praktisch nicht: Er wird nie ausgeführt, und es wird kein Speicher für seine Variablen zugewiesen. Man kann eine Klasse mit einer Gießform vergleichen: Speicher wird nur reserviert, wenn man sie nutzt. Unbenutzt verbleibt sie ohne Ressourcenverbrauch.
Konstruktor
- Spezielle Methode, deklariert mit dem Schlüsselwort
constructor; - Das System reserviert zuerst Objektspeicher, bevor der Konstruktor-Code ausgeführt wird;
- Alle Klassen erben implizit von
TObjectund besitzen einen parameterlosen StandardkonstruktorCreate, der auch ohne manuelle Definition funktioniert; - Eigene Konstruktoren sind die beste Methode zur Objektinitialisierung, mit ihnen lassen sich Feldern Anfangswerte zuweisen;
- Eigene Konstruktoren tragen üblicherweise den Namen
Create.
Beispiel
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; // Zuerst den Elternkonstruktor aufrufen
InternalStuff := TObject.Create;
Writeln('Konstruktor TAnimal.Create ausführen');
end;
destructor TAnimal.Destroy;
begin
Writeln('Destruktor TAnimal.Destroy ausführen');
FreeAndNil(InternalStuff); // Internes Unterobjekt freigeben
inherited Destroy; // Am Ende den Elterndestruktor aufrufen
end;
var
C: TAnimal;
begin
C := TAnimal.Create;
try
// Objekt verwenden
finally
FreeAndNil(C); // Ruft automatisch den Destruktor Destroy auf
end;
end.
Ausgabe bei Ausführung
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
Konstruktor TMyClass.Create ausführen
Destruktor TMyClass.Destroy ausführenCode-Sprache: CSS (css)
InternalStuff ist ein im Inneren der Klasse verwaltetes Unterobjekt. Es wird im Konstruktor erzeugt und muss im Destruktor mit FreeAndNil freigegeben werden, um Speicherlecks zu vermeiden.
