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 constructeur de déplacement

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Apprenez à équiper une classe d'un constructeur de déplacement, comme il y en a dans tous les programmes. Il s'agit de gagner en efficacité sans concession sur la fiabilité.

Transcription

Afin de profiter des avantages de la sémantique de déplacement, nous devons savoir implémenter un constructeur de déplacement. Alors pour apprendre à le faire, on va utiliser une classe cadre dans laquelle nous allons l'implémenter. Ici cette classe cadre permet d'afficher du texte voilà sous la forme d'un cadre entouré de caractères spéciaux. Donc ici notre classe cadre a deux constructeurs, le premier constructeur qui est un constructeur avec paramètres deuxième constructeur qui est le constructeur copie, un destructeur, un opérateur d'affectation, une méthode "afficher" pour afficher le cadre, et puis une méthode "logContenu" qui permet de voir un peu ce qu'il se passe dans la classe au fur et à mesure de ces créations donc ici un "logContenu" du constructeur, ou un "logContenu" du destructeur pour voir quand la classe est détruite. On a aussi trois champs qui sont le champ _texte qui contient le texte à afficher qui est une chaine C standard, et deux autres champs pour l'apparence de notre cadre : _motif et _marge. Si on descend dans le "main", on voit qu'on créé ici quatre cadres : 'a', 'b', 'c' par copie de 'b', et puis 'd' par défaut il ne contiendra rien. Donc si ici on lance notre programme on a bien la construction de nos quatre cadres 'a', 'b', 'c' et 'd'. L'affichage de ces quatre cadres : rien pour d, c'est normal il est vide, et puis l'appel au destructeur de nos quatre variables locales 'a', 'b', 'c', 'd avec leur contenu au moment de la destruction. Alors nous allons ajouter le constructeur de déplacement dans notre classe. Pour ça donc on le met souvent après le constructeur copie, mais ici donc on va prendre par référence un autre cadre mais référence non constante puisqu'on va modifier cet autre cadre en le vidant au profit du cadre que l'on créé. Alors ici j'ai mis un "&" mais c'est une référence rvalue qu'il faut prendre en paramètre. Donc il faut mettre un double "&", le simple "&" c'est la référence lvalue, le double "&" la référence rvalue. Autre caractéristique aussi de notre constructeur de déplacement, le "noexcept", qui en fait garantit que notre constructeur de déplacement ne lèvera pas d'exception. Code Blocks nous propose deux "noexcept", puisque j'en ai fait un pour compatibilité avec Visual C++, qui dans ses anciennes versions ne supporte pas le "noexcept" et donc ici moi dans mon code j'utiliserai "noexcept_". Vous, si vous avez un compilateur qui supporte le "noexcept", je vous invite à utiliser le "noexcept" standard, c'est à dire sans le underscore. Alors je l'ai défini ici, il est défini donc sans rien donc pour les anciens compilateurs, et puis pour les nouveaux, avec le "noexcept" standard du C++11. Voilà, donc j'ai déclaré ce constructeur de déplacement, il faut maintenant que le créé. Je le fais ici. Je vais bien sûr l'implémenter. Alors première chose pour ne pas oublier : "logContenu" pour afficher donc que je passe par le constructeur de déplacement. Alors je n'utilise pas d'accents parce que c'est un affichage console et Windows, en mode console, n'a pas le même code page qu'en mode fenêtré donc pour ne pas avoir un caractère bizarre à la place de mon "é" je ne mettrai pas d'accents. Il faut donc maintenant que j'implémente ce constructeur de déplacement et pour ça donc, je vais initialiser chacun des champs. Mais ces champs je vais les initialiser en reprenant tout simplement les champs de l'autre objet. Cadre. Alors je peux aussi utiliser à ce niveau-là si j'avais des objets je pourrais utiliser "move" ici. Ici comme j'ai des types primitifs comme on peut dire, c'est à dire des types standards C, je peux directement utiliser l'affectation. Et "_marge". Ici donc ça ressemble à une copie, il faut bien sûr pour que ce soit un vrai déplacement, réinitialiser mon autre objet pour qu'il ne contienne plus les anciennes données, sinon ce serait une très mauvaise copie et j'aurai des risques de plantage. Ici c'est un déplacement donc il faut surtout que l'ancien objet ne contienne plus les données qu'il avait précédemment. Donc pour ça, et c'est lié à la spécficité de mon cadre, j'ai simplement besoin de réinitialiser le texte, le motif et la marge peuvent ne pas être réinitialisés. L'effet sera le même. Donc ici j'ai utilisé le pointeur null du C++ standard. Donc j'ai implémenté mon constructeur de déplacement il faut maintenant que je l'utilise. Je vais le faire au niveau par exemple de 'd' pour initialiser. Et je vais initialiser 'd' non pas par copie de 'a' mais par déplacement de 'a'. Donc là, constructeur de déplacement, pour que le commentaire soit à jour. Et donc en exécutant ici, j'ai l'appel au constructeur de déplacement 'Bonjour' ici, et quand j'affiche 'a' et ben ce 'a' a été réinitialisé puisque son contenu est passé directement à 'd'. Et donc lorsque je détruis mes différents objets, la destruction se produit dans l'ordre inverse de la création : et donc 'd' est détruit en premier, puis 'c', puis 'b', puis 'a'. Dernier point, le constructeur de déplacement peut être aussi utilisé lorsque l'on fait un appel de fonction. Prenons un appel de fonction classique où j'ai par exemple un cadre qui est passé en paramètre, un cadre je vais l'appeler ... 'x' pour ne pas confondre avec ceux qu'on a déjà, je retourne, donc là je vais prendre aussi un cadre, voilà. Donc une fonction voilà qui est appelée et qui est très simple puisqu'elle retourne ce qu'elle a reçu. Par exemple je vais l'utiliser ici, au moment de l'initialisation de 'c'. Et ben on va voir que l'appel au constructeur de déplacement se fait ici au moment de retourner la valeur de la fonction. En effet, la valeur de retour d'une fonction est une donnée temporaire, une rvalue déplaçable, et c'est pour ça que le constructeur de déplacement est utilisé pour optimiser la copie des données de cette variable temporaire. Nous voyons donc que le constructeur de déplacement est une étape importante dans l'implémentation de la sémantique de déplacement dans une classe. Nous allons voir par la suite qu'il y a d'autres choses à implémenter.

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 !