Diese drei Methoden sind essentielle Bestandteile jeder C++ Klasse.
Sie werden
von C++ automatisch erzeugt falls nicht explizit definiert.
-
copy constructor Deklaration:
My3Vector(My3Vectcr & v);
und Verwendung:
My3Vector c(b);
My3Vector c = b; // bei Initialisierung wird copy constructor verwendet
-
= Operator Deklaration:
My3Vector & operator = ( My3Vector & x)
und Verwendung:
My3Vector d;
d = c;
-
Destructor: Deklaration
~My3Vector()
Wird implizit aufgerufen wenn Objekt gelöscht wird (out-of-scope geht).
Für bisherige Beispiele mit einfachen Member-Variablen automatische Erzeugung ausreichend:
-
Copy constructor : Legt neues Objekt an und kopiert
die Member-Variablen (
double x, y, z bei My3Vector).
-
= Operator: Kopiert
die Member-Variablen (
double x, y, z bei My3Vector).
-
destructor: C++ sind Member-Variablen bekannt und räumt auf
Anders bei komplexeren Klassen:
Wenn Objekte "Ressourcen" anlegen, z.B.
Dynamic Memory, File-Handles, Netzwerkverbindungen, ...,
muss man unbedingt selbst geeignete
Copy constructor, = Operator, Destructor
Methoden definieren, die die entsprechenden Resourcen verwalten (neu anlegen, kopieren, löschen, etc).
Die von C++ automatisch erzeugten sind
unzureichend!.
Beispiel
Dynamic Memory: Konstruktor reserviert Speicher und weist ihn Member-Variablen zu:
int * number = new int[100];
- Automatisch generierte Copy constructor bzw = Operator:
Inhalt der Pointer Variable
int * number wird in neues Objekt kopiert,
d.h. zeigt auf dieselbe Speicherstelle wie ursprüngliches Objekt.
- Destructor: Objekt und zugehöriger Pointer verschwinden, allozierter Speicher bleibt übrig
Memory-leak!
Explizite Implementierung nötig:
- Copy constructor: Neuen Speicherbereich anlegen, Speicherinhalt kopieren
- = Operator: Existierenden Speicherbereich ggf freigeben, neuen Speicherbereich anlegen, Speicherinhalt kopieren.
- Destructor: Angelegten Speicherbereich freigeben
GDuckeck
2019-08-01