Logo BKs Home - Ein neuer Versuch. Logo

C++ FAQs

   
C++ makes it much harder to shoot yourself in the foot, but when you do, it blows off your whole leg.
- Bjarne Stroustrup

In C we had to code our own bugs. In C++ we can inherit them.
-Prof. Gerald Karam

    
   

Einleitung
Was hat es mit diesen C++ FAQs aufsich?  updated 

C++ allgemein
Sollte man Variablen zu Beginn eines Blocks deklarieren?save
Was muss man beim Test auf eof() beim Lesen aus C++ Streams beachten?save
Wie lassen sich Speicher- bzw. Ressourcenlöcher vermeiden?save
Was sind auto_ptr und wie setzt man sie ein?save
Was ist falsch an void main() { /* ... */ } bzw. main() { /* ... */ }?save
Wie macht man aus einer Zahl einen String?save
Sollte man <iostream.h> oder <iostream> verwenden?  updated 
Was ist eine using-Deklaration?save
Was ist eine using-Direktive?save
Warum kann man Methoden von Basisklassen nicht in abgeleiteten Klassen überladen?save
Was bedeutet das Schlüsselwort static?save
Was ist der Unterschied zwischen <name.h> und <cname>? 

C++ speziell
Wird für den folgenden Code ein Standardkonstruktor erzeugt? Werden die Member initialisiert?save
Was besagt die one definition rule (ODR)?  updatedsave
Was versteht man unter "Koenig Lookup"?save
Wann wird ein Standardkonstruktor erzeugt? Und was tut er?save
Was ist die Regel der großen Drei (Law of the big three)?save
Wie kann man Strings case-insensitiv vergleichen?save
Wird für T x = u; der Zuweisungsoperator von T aufgerufen?save
Ist Zuweisung nicht trivialer Objekte immer langsamer als Initialisierung?save
Überladen, Überschreiben, Überdecken - Was ist was? 

Anderes
Was ist richtige Vererbung und was hat dies mit dem Liskov-Prinzip zu tun?save
Was ist das open-closed Principle?save
Was ist schlecht an globalen Variablen?save
Wie kann man den Inhalt eines Verzeichnisses auflisten?  updated 
Was ist const-correctness?save
Was ist das Singleton-Pattern und wie wird es in C++ implementiert?save
Was bedeutet "named return value optimization"?save
Wie erhält man richtige Vererbung ohne Liskov-Prinzip?save
Warum sollten Instanzvariablen immer private sein?save



zurück zum Seitenanfang
   Q: Wann wird ein Standardkonstruktor erzeugt? Und was tut er?

Es gibt mehrere Situationen in denen ein Standardkonstruktor erzeugt wird:

1. Wenn eine Klasse X ohne Konstruktor ein Member einer Klasse Y mit Standardkonstruktor enthält, so erhält die Klasse X einen Standardkonstruktor. Dieser Standardkonstruktor enthält Code, um den Standardkonstruktor der Klasse Y aufzurufen. Als Pseudo-Code könnte das etwas so aussehen:

// ACHTUNG: Der Code dient nur zur Anschauung!
X::X()
{
    y.Y(); // y ist das Memberobjekt.
}
Falls die Klasse X mehrere Objekte enthält, werden natürlich für diese entsprechend die Standardkonstruktoren aufgerufen.

2. Wenn eine Klasse X ohne Konstruktor von einer Klasse Y mit Standardkonstruktor abgeleitet wird. Hier muss der Compiler einen Standardkonstruktor für X erzeugen, der Code für den Aufruf des Basisklassenkonstruktors enthält. Falls X von mehreren Klassen erbt, geschieht der Aufruf der Baisklassenkonstruktoren in der Deklarationsreihenfolge der Vererbung (von links nach rechts). Sollte X zusätzlich Memberobjekte mit Standardkonstruktoren enthalten (siehe 1), werden zuerst die Basisklassenkonstruktoren und dann die Standardkonstruktoren der Memberobjekte aufgerufen.

3. Existieren in einer Klasse X eine oder mehere virtuelle Methoden, so wird ein Standardkonstruktor erzeugt. Dieser Konstruktor enthält Code um den erforderlichen vptr zu initialisieren.

4. Falls die Klasse X eine oder mehrere virtuelle Basisklassen besitzt, wird ebenfalls ein Standardkonstruktor erzeugt. Dieser enthält Initialisierungscode um später auf jede virtuelle Basisklasse zugreifen zu können. Da die Implementation des virtuellen Erbens nicht vorgegeben ist, sie also von Compiler zu Compiler variiert, sieht auch der entsprechende Initialisierungscode immer anders aus.

Fazit: Es gibt verschiedene Situationen in denen ein Standardkonstruktor erzeugt wird. Diese Situationen treten aber immer nur dann ein, wenn die Implementation einen Standardkonstruktor benötigt (Aufruf von Member-Objekt oder Basisklassen Standardkonstruktoren, Initialisierung des virtuelle Methoden/virtuelle Basisklassen Mechanismus für jedes Objekt). Sollten also programmtechnische Gründe (Initialisierung usw.) einen Standardkonstruktor erforderlich machen, muss dieser explizit vom Programmierer bereitgestellt werden.

Ein automatisch erzeugter Standardkonstruktor führt keine Initialisierungen mit Standard-Werten aus, solange dies nicht von der Implementation gefordert ist.

Beispiel:

class Y{int x; Y() : x(0)};
class X
{
    Y y;
    char* pNext;
};

Die Instanzvariable pNext wird von dem erzeugten Standardkonstruktor nicht initialisiert. Falls eine solche Initialisierung gewünscht wird, muss der Programmierer selbst einen Standardkonstruktor implementieren.

Literatur:
  • S. Lippman: "Default Constructor Synthesis - C++ Report Jan. 1994"
  • ISO/EIC 14882 - Programming languages C++ (C++ Standard)

   
   
Ihr Feedback ist mir wichtig:
Wie würden Sie diese Antwort bewerten? Als:     
Haben Sie Fragen, Ergänzungen oder Verbesserungen? Schreiben Sie mir: hume@c-plusplus.de
zurück zum Seitenanfang
    Zuletzt aktualisiert am: 13.01.2007 zurück zur Startseite    
    © Benjamin Kaufmann - Fragen, Kritik und Anregungen bitte direkt an mich oder ins Gästebuch