Le 14 septembre 2017, nous avons publié une version actualisée de notre Politique de confidentialité. En utilisant video2brain.com vous vous engagez à respecter ces documents mis à jour. Veuillez donc prendre quelques minutes pour les consulter.

C++ : La sémantique de déplacement

Créer un opérateur d'affectation avec déplacement

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Rendez compatibles vos classes à l'aide de la fonction std::move et des containers standards. Ainsi, vous allez implémenter un opérateur d'affectation.

Transcription

Afin de profiter des avantages de la sémantique de déplacement, il faut non seulement ajouter un constructeur de déplacement dans nos classes comme on l'a vu précédemment, et comme on le voit ici dans notre classe, mais aussi ajouter un opérateur d'affectation de déplacement. Nous allons voir son utilité en passant par une affectation standard. Par exemple ici j'ajoute dans mon programme une affectation d'un cadre dans un autre, ici 'd' va recevoir 'b'. Et pour bien constater cette opération, je vais rajouter un log ici à l'image des autres, qui me permet de voir donc une affectation par copie de 'b' dans 'd'. Et puis pour constater cette affectation, donc un affichage même si il est en-dessous, on peut l'enrichir en prenant simplement 'b' et 'd'. Ici, et en affichant ces deux cadres. Alors en lançant donc, on a bien l'affectation de 'b' dans 'd', ici, affectation par copie de 'b' dans 'd'. Ici j'affecte tout le monde, ici ça c'est le log qu'il y a dans l'affectation. Et on voit donc 'b' et 'd' identiques. Alors, si jamais je voulais faire un "move" entre 'b' et 'd', donc une opération assez proche, on a vu précédemment que pour faire un "move" on pouvait convertir grâce à "move" 'b' en une rvalue déplaçable, et donc l'affecter dans 'd'. Alors le problème qu'on va avoir ici c'est que 'd' étant déjà créé, si le compilateur essaye de trouver un opérateur d'affectation de déplacement. Je mets 'deplacement' sans accent pour ne pas avoir de caractère spécial sur la console. Et donc le compilateur essaye de trouver un opérateur de déplacement, mais il n'en trouve pas et donc 'b' qui aurait dû être vidé lors du déplacement ne l'est pas puisqu'il a appelé l'opérateur d'affectation par copie classique : à défaut d'autre chose, le compilateur a pris ce qu'il avait sous la main, si on peut dire. Alors on va justement lui donner un opérateur d'affectation par déplacement en l'implémentant. Donc on s'inspire vraiment de l'opérateur d'affectation par copie, mais la grande différence donc c'est qu'on va avoir une rvalue. On va rajouter le "noexcept" qu'on avait mis aussi sur le constructeur de déplacement, pour garantir qu'il n'y aura pas d'exception lors de ce déplacement : ici le "noexcept" avec underscore puisque je veux être compatible avec les anciens compilateurs. Mais pour vous donc, ce sera un "noexcept" si vous avez un compilateur compatible, sans underscore. Le souligner hein, comme on le voit après. Donc je vais l'implémenter. Donc ici ... Je reprends le prototype, l'opération va être assez proche de ce que j'ai ici, je commence déjà pour ne pas oublier : mon log, par le mettre et aussi, en précisant que c'est une affectation par déplacement. Mais en plus de ça bien sûr, il faut faire le déplacement. Donc ici, j'affecte ... l'autre texte. Alors attention si votre texte est déjà initialisé, il faut libérer l'espace mémoire qui est occupé, et donc ici tester d'abord si il est non null, puisqu'on aurait une fuite mémoire dans ce cas-là, qui peut être évitée avec des pointeurs intelligents. Mais ici on a pris un pointeur classique C et donc pensez à faire un "delete" sur ce texte si il n'est pas null. Alors donc ici on affecte l'ancienne valeur de votre point texte. Pour des raisons de rapidité, vous pouvez aussi utiliser "move" qui vous permettra de recopier également et de déplacer également, vos données plus complexes, notamment de classe. Enfin, la marge. Et donc comme on l'a vu dans le constructeur de déplacement, on peut réinitialiser assez facilement l'autre en mettant son texte à null. Voilà : donc ici j'ai bien l'opérateur d'affectation par déplacement, et donc quand je lance j'ai bien l'affectation par déplacement qui est appelée, et donc 'b' qui est vidé de son contenu au moment hein ... ce qu'on a ici, de l'affectation par déplacement. Notre classe intègre maintenant complètement la sémantique de déplacement ce qui provoque une surcharge, un petit peu, des implémentations de méthode. Pour alléger cette surcharge légère, nous allons voir par la suite comment implémenter l'idiome "copy-swap".

C++ : La sémantique de déplacement

Développez des classes compatibles avec la sémantique de déplacement en C++. Obtenez un code robuste et performant grâce à une utilisation pertinente de la sémantique move.

31 min (10 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :24 oct. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !