0Pricing
C++ Academy · Leçon

Constructeurs de déplacement et affectation par déplacement

Implémenter correctement les constructeurs de déplacement et les opérateurs d’affectation par déplacement

Constructeurs de déplacement et affectation par déplacement est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.

Deux membres spéciaux

Le constructeur de déplacement et l’opérateur d’affectation par déplacement permettent à votre classe de prendre possession des ressources d’une autre instance sans les copier.

Signature

Tous deux acceptent une référence rvalue vers le même type.

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

Implémenter un constructeur de déplacement

Récupérez les ressources de la source et laissez celle-ci dans un état valide et vide.

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

Implémenter une affectation par déplacement

Trois étapes : libérer les ressources actuelles, récupérer celles de la source, puis laisser la source vide.

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

Pourquoi noexcept est important

Marquez les opérations de déplacement comme noexcept chaque fois que possible. Les conteneurs standard tels que std::vector n’utilisent le déplacement lors d’un redimensionnement que si ces opérations sont noexcept ; sinon, ils reviennent aux copies pour garantir la sûreté vis-à-vis des exceptions.

La règle des cinq

Si vous écrivez l’un de ces cinq éléments, réfléchissez aux cinq :

  • Destructeur
  • Constructeur de copie
  • Affectation par copie
  • Constructeur de déplacement
  • Affectation par déplacement

La règle du zéro

C’est encore mieux : n’en écrivez aucun. Stockez les membres dans des types RAII (vecteurs, chaînes de caractères, pointeurs intelligents). Les versions par défaut générées par le compilateur fonctionnent correctement et efficacement.

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

Quand le compilateur génère des déplacements

Le compilateur génère des membres de déplacement par défaut uniquement lorsque :

  • Aucun constructeur de copie, opérateur d’affectation par copie, destructeur ou membre de déplacement n’a été déclaré par l’utilisateur
  • Tous les membres et les classes de base sont eux-mêmes déplaçables

Déplacements par défaut et supprimés

Vous pouvez demander ou interdire explicitement les déplacements générés par le compilateur.

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

Après un déplacement

L’objet dont les ressources ont été déplacées se trouve dans un état valide mais non spécifié. Vous pouvez :

  • Le détruire
  • Lui affecter une nouvelle valeur
  • Appeler toute opération qui n’a aucune précondition (size(), empty(), clear())

Cas d’utilisation

La sémantique de déplacement accélère :

  • Le retour de gros objets (lorsque le RVO ne s’applique pas)
  • L’insertion de gros objets dans des conteneurs (push_back de valeurs temporaires)
  • L’implémentation de vos propres types qui possèdent des ressources

Vérification rapide

Pourquoi les constructeurs de déplacement et les opérateurs d’affectation par déplacement devraient-ils être marqués noexcept ?

Récapitulatif

Les constructeurs de déplacement et les opérateurs d’affectation par déplacement s’approprient les ressources d’une valeur temporaire sur le point de disparaître. Marquez-les noexcept pour accélérer les conteneurs. Suivez la règle des cinq — ou mieux, la règle du zéro en composant des types RAII standard.

Questions Fréquemment Posées

La leçon « Constructeurs de déplacement et affectation par déplacement » est-elle gratuite ?

Oui — le texte complet de « Constructeurs de déplacement et affectation par déplacement » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Constructeurs de déplacement et affectation par déplacement » ?

Implémenter correctement les constructeurs de déplacement et les opérateurs d’affectation par déplacement Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C++ Academy ?

Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Constructeurs de déplacement et affectation par déplacement » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?

Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Lvalue ou rvalue : la distinction
  2. Références rvalue et syntaxe &&
  3. std::move et std::forward
  4. Constructeurs de déplacement et affectation par déplacement
← Retour à C++ Academy