Im letzten Abschnitt wurde gezeigt, wie die Elemente der zugrundeliegenden Basisklasse über einen gezielten Konstruktoraufruf initialisiert werden können.
Ähnliches gilt für die eigenen Elemente einer Klasse, wenn diese wiederum Objekte sind (also nicht eine ,,IST EIN``-Beziehung vorliegt, sondern eine ,,HAT EIN``-Beziehung).
Beispiel: Ein Computer soll aus einer CPU vom Typ
Prozessor, einer HD vom Typ Festplatte und einer
Arbeitsspeicherkapazität SpeicherMB vom Typ int bestehen.
Dann könnte das etwa so aussehen:
class Prozessor { private: int TaktrateMHz; int Busbreite; public: Prozessor( int TaktMHz = 8, int Bus = 16 ) { TaktrateMHz = TaktMHz; Busbreite = Bus; } }; class Festplatte { private: int KapazitaetMB; // MB Speicherplatz public: Festplatte( int KapMB ) { KapazitaetMB = KapMB; } }; class Computer { private: Prozessor CPU; Festplatte HD; int SpeicherMB; // MB Arbeitsspeicher public: Computer( int TaktMHz, int Bus, int KapMB, int RAM ) : CPU( TaktMHz, Bus ), // Initialisierung CPU HD( KapMB ) // Initialisierung HD { SpeicherMB = RAM; // Initialisierung SpeicherMB } }; //... Computer MeinPC( 1400, 32, 18000, 512*1024 );
Man gibt also die Initialisierungen der einzelnen Komponenten ähnlich an wie den Aufruf von Basiskonstruktoren; allerdings nicht mit dem Typnamen, sondern dem Elementnamen stattdessen.
Wenn mehrere Initialisierungen nötig sind, trennt man die einzelnen mit Kommata.
Wenn beides nötig ist (Initialisierung der Basisklasse und Initialisierung von Elementen), dann gibt man halt auch beides an:
//... class Computer: Elektronikbaugruppe // jetzt abgeleitet! { private: Prozessor CPU; Festplatte HD; int SpeicherMB; // MB Arbeitsspeicher public: Computer( int TaktMHz, int Bus, int KapMB, int RAM ) : Elektronikbaugruppe( TaktMHz ), // Init. Basisklasse CPU( TaktMHz, Bus ), // Initialisierung CPU HD( KapMB ) // Initialisierung HD { SpeicherMB = RAM; // Initialisierung SpeicherMB } }; //...
Dabei wird immer erst die Initialisierung der Basisklasse(n) ausgeführt, dann die der Elemente (in der angegebenen Reihenfolge). Erst anschließend erfolgt die Abarbeitung des Funktionsrumpfes des Konstruktors.