============================ Auf- und Abbau eines Objekts [TOC] ============================ Diese Sitzung dient der Beschäftigung mit den speziellen Methoden einer Klasse. Dies sind Methoden, die implizit vom Übersetzer benutzt werden und auch unter bestimmten Bedingungen vom Übersetzer selbst erzeugt werden. Default Constructor =================== Beginnen wir mit den Konstruktoren. Es gibt den sogenannten _default constructor_ ohne Parameter, der durch den Übersetzer gestellt wird, wenn alle nicht-statischen Variablen-Komponenten der Klasse ohne Parameter (also mit _default constructor_) konstruierbar sind und kein einziger Konstruktor angegeben wird. Der durch den Übersetzer erzeugte _default constructor_ konstruiert alle nicht-statischen Variablen-Komponenten in der deklarierten Reihenfolge. Da bei den elementaren Datentypen keine Initialisierung erfolgt, kann hier nur etwas anfallen, wenn nicht-triviale Variablen dabei sind. Folgendes Beispiel möge dies demonstrieren: :import: session02/default-constructors.cpp ---- SHELL (path=session02,hostname=theon) --------------- g++ -Wall -o default-constructors default-constructors.cpp ./default-constructors ---------------------------------------------------------- In diesem Beispiel hat die Klasse _Z_ überhaupt keinen Konstruktor. Somit wurde ein _default constructor_ durch den Übersetzer erzeugt, der nacheinander _x_ und _y_ konstruiert. Bei _X_ und _Y_ ist jeweils ein expliziter _default constructor_ gegeben, der eine Ausgabe erzeugt. An der Ausgabe lässt sich nachvollziehen, dass zuerst _x_ initialisiert wird und erst danach _y_. Und selbst wenn ein expliziter _default constructor_ gestellt wird, so werden alle in ihm nicht explizit konstruierten nicht-statischen Variablenkomponenten implizit konstruiert mit dem _default constructor_, falls vorhanden. Destructor ========== Sofern eine Klasse nicht-trivial ist, d.h. mindestens eine nicht-statische Variable enthält, bei denen eine explizite Abbau-Operation erforderlich ist, wird durch den Übersetzer ein _destructor_ hinzugefügt, der sich darum kümmert. Wenn ein _destructor_ explizit deklariert wird, wird der entsprechende Programmtext beim Abbau ausgeführt, bevor der vom Übersetzer generierte _destructor_ zum Zuge kommt. Der Abbau erfolgt in umgekehrter Reihenfolge, d.h. die zuletzt deklarierte nicht-statische Variablenkomponente kommt zuerst. Folgendes Beispiel demonstriert die Reihenfolge beim Auf- und Abbau: :import: session02/destructors.cpp ---- SHELL (path=session02,hostname=theon) --------------- g++ -Wall -o destructors destructors.cpp ./destructors ---------------------------------------------------------- Fragen ====== Denken Sie über die folgenden Fragen in Ruhe nach und notieren Sie sich die Antwort auf Papier, bevor Sie die Antworten auf der folgenden Seite einsehen. Bitte lassen Sie die Fragen nicht durch den Übersetzer beantworten. * Ist folgendes zulässig? :import: session02/case01.cpp * Ist folgendes zulässig und falls ja, welche Ausgabe ist dann zu erwarten? :import: session02/case02.cpp * Ist folgendes zulässig? Falls nein, wie könnte es korrigiert werden? :import: session02/case03.cpp * Was gibt folgendes Programm aus? :import: session02/case04.cpp :navigate: up -> doc:index next -> doc:session02/page02