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_backvon 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
- Lvalue vs. Rvalue: der Unterschied
- Rvalue-Referenzen und die &&-Syntax
- std::move und std::forward
- Move-Konstruktoren und Move-Zuweisung