0Pricing
C++ Academy · Lektion

Move-Konstruktoren und Move-Zuweisung

Implementieren Sie Move-Konstruktoren und Move-Zuweisungsoperatoren korrekt.

Move-Konstruktoren und Move-Zuweisung ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Zwei besondere Memberfunktionen

Der Move-Konstruktor und der Move-Zuweisungsoperator ermöglichen es Ihrer Klasse, die Ressourcen einer anderen Instanz zu übernehmen, ohne sie zu kopieren.

Signatur

Beide nehmen eine rvalue-Referenz auf denselben Typ entgegen.

class String {
public:
    String(String&& other) noexcept;          // move ctor
    String& operator=(String&& other) noexcept; // move assign
};

Einen Move-Konstruktor implementieren

Übernehmen Sie die Ressourcen der Quelle und hinterlassen Sie sie in einem gültigen leeren Zustand.

String(String&& other) noexcept
    : data_(other.data_), size_(other.size_) {
    other.data_ = nullptr;
    other.size_ = 0;
}

Move-Zuweisung implementieren

Drei Schritte: aktuelle Ressourcen freigeben, die Ressourcen der Quelle übernehmen, die Quelle leeren.

String& operator=(String&& other) noexcept {
    if (this != &other) {
        delete[] data_;
        data_ = other.data_;
        size_ = other.size_;
        other.data_ = nullptr;
        other.size_ = 0;
    }
    return *this;
}

Warum noexcept wichtig ist

Kennzeichnen Sie Move-Operationen nach Möglichkeit mit noexcept. Standardcontainer wie std::vector verwenden beim Vergrößern nur dann Move-Operationen, wenn diese noexcept sind; andernfalls greifen sie aus Gründen der Ausnahmesicherheit auf Kopien zurück.

Die Rule of Five

Wenn Sie eines dieser fünf Elemente selbst schreiben, denken Sie an alle fünf:

  • Destruktor
  • Copy-Konstruktor
  • Copy-Zuweisungsoperator
  • Move-Konstruktor
  • Move-Zuweisungsoperator

Die Rule of Zero

Noch besser – schreiben Sie keines davon. Speichern Sie Member als RAII-Typen (Vektoren, Strings, Smart Pointer). Die vom Compiler erzeugten Standardimplementierungen funktionieren korrekt und effizient.

class Widget {
    std::string name_;
    std::vector<int> data_;
    // No need for destructor, copy, or move — compiler does the right thing
};

Wenn der Compiler Move-Funktionen generiert

Der Compiler generiert standardmäßige Move-Funktionen nur, wenn:

  • kein vom Benutzer deklarierter Kopierkonstruktor, Kopierzuweisungsoperator, Destruktor oder keine Move-Funktion vorhanden ist
  • alle Member und Basisklassen selbst verschiebbar sind

Standardmäßig definierte und gelöschte Move-Funktionen

Sie können die vom Compiler generierten Move-Funktionen explizit anfordern oder verbieten.

class Widget {
public:
    Widget(Widget&&) = default;
    Widget& operator=(Widget&&) = default;
    // or
    Widget(Widget&&) = delete;
};

Nach einem Move

Das Objekt, aus dem verschoben wurde, befindet sich in einem gültigen, aber nicht spezifizierten Zustand. Sie können:

  • es zerstören
  • ihm einen neuen Wert zuweisen
  • jede Operation ohne Vorbedingung aufrufen (size(), empty(), clear())

Einsatzfälle

Die Move-Semantik beschleunigt:

  • die Rückgabe großer Objekte (wenn RVO nicht greift)
  • das Einfügen großer Objekte in Container (push_back von Rvalues)
  • die Implementierung eigener ressourcenbesitzender Typen

Schnelltest

Warum sollten Move-Konstruktoren und Move-Zuweisungsoperatoren mit noexcept gekennzeichnet werden?

Zusammenfassung

Move-Konstruktoren und Move-Zuweisungsoperatoren übernehmen Ressourcen von einem Rvalue, dessen Lebensdauer bald endet. Kennzeichnen Sie sie mit noexcept, damit Container schneller arbeiten. Befolgen Sie die Rule of Five – oder besser die Rule of Zero, indem Sie standardmäßige RAII-Typen kombinieren.

Häufig gestellte Fragen

Ist die Lektion „Move-Konstruktoren und Move-Zuweisung“ kostenlos?

Ja — der vollständige Text von „Move-Konstruktoren und Move-Zuweisung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Move-Konstruktoren und Move-Zuweisung“?

Implementieren Sie Move-Konstruktoren und Move-Zuweisungsoperatoren korrekt. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Move-Konstruktoren und Move-Zuweisung“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Lvalue vs. Rvalue: der Unterschied
  2. Rvalue-Referenzen und die &&-Syntax
  3. std::move und std::forward
  4. Move-Konstruktoren und Move-Zuweisung
← Zurück zu C++ Academy