C++ Best Practice

Auf dieser Seite werden Hinweise und Tips für die Programmierung mit C++ aufgeführt.

Pointer als Member in Klassen

Pointer werden nicht wie in Java vom Compiler mit 0 (null bzw. NULL) initialisiert, dies sollte in der Initialisierungsliste des Konstruktors der Klasse nachgeholt werden.

Grund: Pointer werden mit einer zufälligen Zahl initialisiert; wenn dann auf diese undefinierte Adresse zugegriffen wird, kommt es häufig zu einem Zugriffsfehler, der die Applikation abstürzen lässt. Wenn sichergestellt ist, dass dem Zeiger eine gültige Adresse zugewiesen wird, bevor er das erste Mal auf ihn zugegriffen wird, kann die Initialisierung entfallen. Das lässt sich aber nur schwer sicherstellen (außer wenn dem Pointer statt 0 eine gültigen Adresse in der Initialisierungsliste im Konstruktor zugewiesen wird.

Wenn eine Klasse Member hat, die Pointer darstellen, dann sollte sie einen Copy-Konstruktor besitzen und der Zuweisungsoperator sollte überschrieben werden.

Grund: Der Standard-Copy-Konstruktor und der Standardzuweisungesoperator kopieren ein Objekt Member für Member, d. h. der Pointer wird einfach als int-Wert. Damit zeigt das Original und die Kopie auf den selben Speicherbereich! Manipulation oder ein Löschen des Speicherbereichs in dem einen Objekt, macht das andere Objekt ungültig.

Zuweisungsoperator überschreiben

  • Zielobjekt existiert im Gegensatz zum Kopierkonstruktor bereits!
  • Prüfen ob Argument gleich dem aktuellen Objekt ist. Wird die Zuweisung auf sich selbst durchgeführt, kann durch Speicher freigeben und neu anfordern Information verloren gehen.
  • Gibt immer eine Referenz auf sich selbst zurück (*this).

Pointer-Implementation (Pimpl)

  • Reduziert die Abhängigkeiten der Kompilierungseinheiten untereinander.
  • Im Header-Files Typen möglichst nur deklarieren, Typdefinition (einbinden anderer Header) nur, wenn Kompilieren sonst unmöglich, z. B. bei Vererbung.

Zurück