Move-konstruktorer och move-tilldelning
Implementera move-konstruktorer och move-tilldelningsoperatorer korrekt
Move-konstruktorer och move-tilldelning är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Två speciella medlemsfunktioner
Move-konstruktorn och move-tilldelningsoperatorn låter klassen ta över resurserna från en annan instans utan att kopiera dem.
Signatur
Båda tar en rvalue-referens till samma typ.
class String {
public:
String(String&& other) noexcept; // move ctor
String& operator=(String&& other) noexcept; // move assign
};Implementera en move-konstruktor
Ta över källans resurser och lämna den i ett giltigt, tomt tillstånd.
String(String&& other) noexcept
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr;
other.size_ = 0;
}Implementera move-tilldelning
Tre steg: frigör de aktuella resurserna, ta över källans resurser och lämna källan tom.
String& operator=(String&& other) noexcept {
if (this != &other) {
delete[] data_;
data_ = other.data_;
size_ = other.size_;
other.data_ = nullptr;
other.size_ = 0;
}
return *this;
}Varför noexcept är viktigt
Markera move-operationer med noexcept när det är möjligt. Standardcontainrar som std::vector använder bara move vid storleksändring om operationerna är noexcept; annars använder de kopior för att säkerställa undantagssäkerhet.
Femregeln
Om Du skriver någon av dessa fem bör Du tänka på alla fem:
- Destruktor
- Copy-konstruktor
- Copy-tilldelning
- Move-konstruktor
- Move-tilldelning
Nollregeln
Ännu bättre – skriv ingen av dem. Lagra medlemmar som RAII-typer (vektorer, strängar och smarta pekare). Kompilatorns automatiskt genererade standardimplementationer fungerar korrekt och effektivt.
class Widget {
std::string name_;
std::vector<int> data_;
// No need for destructor, copy, or move — compiler does the right thing
};När kompilatorn genererar move-operationer
Kompilatorn genererar defaultade move-medlemmar endast när:
- Ingen användardeklarerad kopieringskonstruktor, kopieringstilldelningsoperator, destruktor eller move-medlem finns
- Alla medlemmar och basklasser själva kan flyttas
Defaultade och borttagna move-operationer
Ni kan uttryckligen begära eller förbjuda de move-operationer som kompilatorn genererar.
class Widget {
public:
Widget(Widget&&) = default;
Widget& operator=(Widget&&) = default;
// or
Widget(Widget&&) = delete;
};Efter en move-operation
Det flyttade objektet befinner sig i ett giltigt men ospecificerat tillstånd. Ni kan:
- Förstöra det
- Tilldela det ett nytt värde
- Anropa valfri operation som saknar förvillkor (size(), empty(), clear())
Användningsområden
Move-semantik snabbar upp:
- Retur av stora objekt (när RVO inte aktiveras)
- Infogning av stora objekt i containrar (push_back av rvalues)
- Implementering av egna typer som äger resurser
Snabbtest
Varför bör move-konstruktorer och move-tilldelningsoperatorer markeras med noexcept?
Sammanfattning
Move-konstruktorer och move-tilldelningsoperatorer tar över resurser från ett rvalue som snart kommer att förstöras. Markera dem med noexcept för bättre prestanda i containrar. Följ Rule of Five — eller ännu hellre Rule of Zero genom att komponera standardtyper med RAII.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Move-konstruktorer och move-tilldelning” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Move-konstruktorer och move-tilldelning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Move-konstruktorer och move-tilldelning”?
Implementera move-konstruktorer och move-tilldelningsoperatorer korrekt Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Move-konstruktorer och move-tilldelning”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Lvalue och rvalue: skillnaden
- Rvalue-referenser och syntaxen &&
- std::move och std::forward
- Move-konstruktorer och move-tilldelning