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
- Lvalue ou rvalue : la distinction
- Références rvalue et syntaxe &&
- std::move et std::forward
- Constructeurs de déplacement et affectation par déplacement