C++ Academy · Lektion

Move-konstruktorer och move-tilldelning

Implementera move-konstruktorer och move-tilldelningsoperatorer korrekt

Lektion 4 av 413 steg

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.

Gratis att börja

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

  1. Lvalue och rvalue: skillnaden
  2. Rvalue-referenser och syntaxen &&
  3. std::move och std::forward
  4. Move-konstruktorer och move-tilldelning
← Tillbaka till C++ Academy