Konstruktoren, Destruktoren und Rule of Zero
Ein Konstruktor initialisiert ein neues Objekt. Er trägt den Klassennamen und hat keinen Rückgabetyp. Ein Destruktor läuft bei der Zerstörung und heißt wie die Klasse mit vorangestelltem ~.
Konstruktoren, Destruktoren und Rule of Zero#
Eigene Datentypen und Klassen · Lektion 41 von 60
Voraussetzungen: Klassen, RAII. Lernziel: Du erzeugst gültige Objekte und lässt ihre Member selbst aufräumen.
Ein Konstruktor initialisiert ein neues Objekt. Er trägt den Klassennamen und hat keinen Rückgabetyp. Ein Destruktor läuft bei der Zerstörung und heißt wie die Klasse mit vorangestelltem ~.
1#include <iostream>2#include <string>3#include <utility>4 5class Begruessung {6public:7 explicit Begruessung(std::string name)8 : name_(std::move(name)) {9 }10 11 void anzeigen() const {12 std::cout << "Hallo, " << name_ << "!\n";13 }14 15private:16 std::string name_;17};18 19int main() {20 Begruessung text{"Ada"};21 text.anzeigen();22}Der Teil nach : ist die Memberinitialisierungsliste. name_ wird direkt aus dem Parameter aufgebaut. Das ist etwas anderes als erst ein Objekt anzulegen und ihm im Konstruktorblock einen neuen Wert zuzuweisen.
std::move erlaubt hier, den Inhalt des lokalen Stringparameters zu übernehmen. Der aufrufende Code erhält dadurch keine Referenz auf einen schon beendeten Parameter: Das Member ist ein eigener verwaltender String.
explicit und Initialisierungsreihenfolge#
explicit verhindert bestimmte unbeabsichtigte implizite Umwandlungen über diesen Konstruktor. Eine ausdrückliche Konstruktion wie im Beispiel bleibt möglich.
Member werden in ihrer Deklarationsreihenfolge innerhalb der Klasse initialisiert, nicht nach einer beliebigen Reihenfolge in der Initialisierungsliste. Schreibe beide Reihenfolgen gleich, damit abhängige Initialisierungen verständlich bleiben.
Rule of Zero#
Die Rule of Zero empfiehlt, keine eigenen Spezialfunktionen für Kopieren, Verschieben oder Zerstören zu schreiben, wenn die vorhandenen Member diese Aufgaben schon korrekt erledigen. std::string räumt seinen Speicher selbst auf; Begruessung braucht deshalb keinen eigenen Destruktor.
Die Rule of Five erinnert bei selbst verwalteten Ressourcen an Destruktor, Kopierkonstruktor, Kopierzuweisung, Verschiebekonstruktor und Verschiebezuweisung. Wer einen Rohzeiger besitzt und nur einen löschenden Destruktor ergänzt, kann durch eine versehentliche Kopie zwei Besitzer derselben Adresse erzeugen. Besser ist gewöhnlich ein passendes RAII-Member wie unique_ptr.
Übung#
Warum wäre ein manuelles delete für den internen Speicher von name_ falsch?
Lösung
Der String ist selbst Besitzer seiner internen Ressource. Er zerstört und verwaltet sie nach seinen eigenen Regeln. Fremde Freigabe würde diese Zuständigkeit verletzen.
Weiterlernen#
Zurück: Klassen, Kapselung und gültige Zustände · Kursübersicht · Weiter: Vererbung, virtuelle Funktionen und Komposition
Kommentare 0
Kommentare sind für diese Seite deaktiviert.