Initialisierung der Klassenelemente

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.



AnyWare@Wachtler.de