Tutoriel C++ moderne
Ce tutoriel vise à fournir aux développeurs expérimentés une référence rapide aux nouvelles fonctionnalités de C++11/14/17/20. Il couvre les améliorations de facilité d'utilisation du langage, les progrès en temps d'exécution, de nouveaux conteneurs, les pointeurs intelligents et la gestion de mémoire, les expressions régulières, la programmation concurrente, ainsi qu'un aperçu de C++20.
Aperçu du cours
📚 Résumé du contenu
Ce tutoriel est conçu pour offrir aux développeurs expérimentés une référence rapide sur les nouvelles fonctionnalités de C++11/14/17/20. Le contenu couvre les améliorations de la facilité d'utilisation du langage, les gains de performance à l'exécution, l'utilisation de nouveaux conteneurs, des pointeurs intelligents et la gestion de mémoire, les expressions régulières, la programmation concurrente, ainsi qu'un aperçu de C++20.
Mettez-vous rapidement à jour sur C++11/14/17/20 et franchissez la porte d'entrée vers la programmation moderne en C++.
Auteur : 欧长坤 (Ou Changkun)
Remerciements : Ce travail est publié sous licence CC BY-NC-ND 4.0. Remerciements à tous les contributeurs GitHub et aux communautés associées.
🎯 Objectifs d'apprentissage
- Identifier et vérifier l'environnement du compilateur C++ et l'architecture cible à l'aide d'outils en ligne de commande.
- Expliquer la compatibilité standard et l'historique de chevauchement entre C (C89, C99, C11) et C++ (C++98, C++1x).
- Mettre en œuvre un lien interlangage fonctionnel en utilisant des fichiers d'en-tête
extern "C"et des flux de compilation multistages. - Résoudre les ambiguïtés liées aux pointeurs à l'aide de
nullptret implémenter une logique exécutée à la compilation à l'aide deconstexpretif constexpr. - Simplifier les déclarations complexes à l'aide de
auto,decltypeet de l'aliasing de type (using) tout en assurant une conception robuste orientée objet avecoverrideetfinal. - Concevoir un code hautement générique à l'aide de modèles variadiques, d'expressions de pliage et de déduction de paramètres de modèle non-types.
- Définir et implémenter des expressions Lambda en utilisant divers modes de capture (valeur, référence, expression et générique).
- Utiliser
std::functionetstd::bindpour créer des enveloppes de fonctions flexibles et des applications partielles de fonctions. - Catégoriser les expressions en Lvalues, Prvalues et Xvalues, et appliquer la sémantique de transfert pour optimiser la gestion des ressources des classes.
- Différencier les modèles de mémoire et les cas d'utilisation de
std::array(taille fixe, pile) et destd::vector(taille dynamique, tas).
🔹 Leçon 1 : Évolution historique du C++ et environnement
Aperçu : Cette leçon couvre les fondements techniques de l'environnement de développement C++ et sa relation historique avec le langage C. Elle détaille comment les normes C++ (de C++98 à C++1x) se superposent aux normes C (de C89 à C11) et fournit les mécanismes spécifiques, tels que extern "C", nécessaires pour compiler et lier avec succès des bases de code mixtes C et C++.
Objectifs d'apprentissage :
- Identifier et vérifier l'environnement du compilateur C++ et l'architecture cible à l'aide d'outils en ligne de commande.
- Expliquer la compatibilité standard et l'historique de chevauchement entre C (C89, C99, C11) et C++ (C++98, C++1x).
- Mettre en œuvre un lien interlangage fonctionnel en utilisant des fichiers d'en-tête
extern "C"et des flux de compilation multistages.
🔹 Leçon 2 : Facilité d'utilisation du langage : syntaxe moderne et templates
Aperçu : Cette leçon explore l'évolution du C++ depuis C++11 jusqu'à C++20, en mettant l'accent sur les améliorations qui renforcent la clarté du code, la sécurité des types et la flexibilité des templates. Les étudiants maîtriseront les fonctionnalités modernes de syntaxe telles que l'inférence de type, l'évaluation à la compilation avec constexpr, ainsi que des techniques avancées de template incluant les templates variadiques et les expressions de pliage.
Objectifs d'apprentissage :
- Résoudre les ambiguïtés liées aux pointeurs à l'aide de
nullptret implémenter une logique exécutée à la compilation à l'aide deconstexpretif constexpr. - Simplifier les déclarations complexes à l'aide de
auto,decltypeet de l'aliasing de type (using) tout en assurant une conception robuste orientée objet avecoverrideetfinal. - Concevoir un code hautement générique à l'aide de modèles variadiques, d'expressions de pliage et de déduction de paramètres de modèle non-types.
🔹 Leçon 3 : Améliorations à l'exécution : Lambdas et sémantique de transfert
Aperçu : Cette leçon couvre les améliorations critiques introduites dans le C++ moderne (C++11/14), axées sur les constructions de programmation fonctionnelle et la gestion efficace des ressources. Les étudiants maîtriseront les expressions Lambda — y compris les captures génériques et par expression de C++14 — et approfondiront les mécanismes de la sémantique de transfert, des catégories de valeurs (Lvalues/Rvalues) et du transfert parfait afin d'éliminer les copies profondes inutiles dans les applications haute performance.
Objectifs d'apprentissage :
- Définir et implémenter des expressions Lambda en utilisant divers modes de capture (valeur, référence, expression et générique).
- Utiliser
std::functionetstd::bindpour créer des enveloppes de fonctions flexibles et des applications partielles de fonctions. - Catégoriser les expressions en Lvalues, Prvalues et Xvalues, et appliquer la sémantique de transfert pour optimiser la gestion des ressources des classes.
🔹 Leçon 4 : Conteneurs modernes : std::array
Aperçu : Cette leçon présente std::array, un conteneur introduit en C++11 comme alternative moderne aux tableaux traditionnels en C. Elle explore les avantages d'un conteneur de taille fixe qui encapsule des tableaux bruts tout en offrant une interface plus sûre, compatible avec STL, et une allocation de mémoire basée sur la pile.
Objectifs d'apprentissage :
- Différencier les modèles de mémoire et les cas d'utilisation de
std::array(taille fixe, pile) et destd::vector(taille dynamique, tas). - Initialiser correctement et gérer
std::arrayà l'aide de fonctions membres telles que.size()et.empty(). - Appliquer les algorithmes de la Bibliothèque Standard (STL) et les boucles basées sur des plages aux objets
std::array.
🔹 Leçon 5 : Pointeurs intelligents et gestion de mémoire RAII
Aperçu : Cette leçon introduit le principe fondamental de la gestion de mémoire moderne en C++ : l'acquisition de ressources est initialisation (RAII). Elle couvre la transition du traitement manuel des pointeurs vers une gestion automatisée à l'aide de std::unique_ptr pour une possession exclusive, de std::shared_ptr pour un partage comptabilisé par référence, et de std::weak_ptr pour rompre les cycles de références.
Objectifs d'apprentissage :
- Comprendre et appliquer le principe RAII pour garantir que les ressources sont libérées lorsqu'elles sortent de portée.
- Implémenter des modèles de possession exclusive et partagée à l'aide de
std::shared_ptretstd::unique_ptr. - Identifier et résoudre les fuites de mémoire causées par des références circulaires à l'aide de
std::weak_ptr.
🔹 Leçon 6 : Expressions régulières et analyse de chaînes
Aperçu : Cette leçon traite de l'implémentation des expressions régulières via la bibliothèque standard C++11 (std::regex) et de leur application pratique à l'analyse des requêtes HTTP. Les étudiants apprendront la syntaxe des quantificateurs regex, l'utilisation de std::smatch pour capturer les résultats, et l'intégration architecturale de ces outils au sein d'un environnement de serveur web basé sur des templates.
Objectifs d'apprentissage :
- Identifier et appliquer les caractères spéciaux des expressions régulières (quantificateurs) pour définir des motifs de chaînes.
- Utiliser
std::regexetstd::smatchpour valider les noms de fichiers et extraire des données à partir de chaînes. - Mettre en œuvre la logique centrale du serveur, notamment l'analyse des requêtes HTTP et la cartographie des ressources à l'aide des modèles de mémoire modernes en C++ et des conteneurs.
🔹 Leçon 7 : Parallélisme, concurrence et modèles de mémoire
Aperçu : Cette leçon aborde le changement fondamental apporté par C++11 vers un modèle de multithreading standardisé. Elle passe de la gestion de base des threads et des verrous basés sur RAII à des primitives de synchronisation avancées telles que les futures et les variables conditionnelles, pour conclure par le modèle de mémoire rigoureux de C++11, les opérations atomiques et les garanties de cohérence mémoire.
Objectifs d'apprentissage :
- Gérer les cycles de vie des threads et protéger les ressources partagées à l'aide de
std::thread,std::mutexet des enveloppes RAII (std::lock_guard,std::unique_lock). - Implémenter des workflows asynchrones et la communication entre threads à l'aide de
std::future,std::packaged_tasketstd::condition_variable. - Appliquer les types
std::atomicet sélectionner les stratégies appropriées destd::memory_orderpour garantir la visibilité mémoire et empêcher le réordonnancement illégal d'instructions.
🔹 Leçon 8 : Bibliothèque standard : mises à jour du système de fichiers
Aperçu : Cette leçon explore l'évolution de la Bibliothèque Standard C++, en mettant l'accent sur les fonctionnalités de haut niveau introduites avec C++11 et les versions ultérieures. Elle souligne la transition des implémentations spécifiques à la plateforme ou bas niveau vers des outils standardisés de haut niveau tels que std::filesystem et les outils de concurrence.
Objectifs d'apprentissage :
- Identifier les composants essentiels de concurrence ajoutés à la Bibliothèque Standard avec C++11.
- Reconnaître
std::filesystemcomme une importante nouveauté pour la gestion moderne des chemins et des fichiers. - Comprendre le rôle des abstractions de haut niveau dans la modernisation du développement en C++.
🔹 Leçon 9 : Fonctionnalités modernes diverses
Aperçu : Cette leçon couvre une sélection de fonctionnalités impactantes introduites en C++11 et affinées dans les versions ultérieures afin d'améliorer la sécurité des types, les performances et la lisibilité du code. Les étudiants apprendront à utiliser le type long long int, les spécifications d'exception avec noexcept, les chaînes et littéraux définis par l'utilisateur améliorés, ainsi que le contrôle fin de l'alignement mémoire via alignof et alignas.
Objectifs d'apprentissage :
- Identifier et implémenter le type
long long intpour une précision entière étendue. - Appliquer le spécificateur
noexceptpour optimiser le traitement des exceptions et utiliser l'opérateurnoexceptpour interroger la sécurité d'une fonction. - Utiliser les littéraux de chaîne brutes pour simplifier la définition de chaînes complexes et créer des littéraux définis par l'utilisateur pour des suffixes de type personnalisés.
🔹 Leçon 10 : C++20 : L'avenir du langage
Aperçu : Cette leçon présente les « Quatre grandes pierres angulaires » de C++20 : Concepts, Modules, Coroutines et Plages. Ces fonctionnalités représentent l'évolution la plus significative du langage depuis C++11, en se concentrant sur l'amélioration de la sécurité des templates, de l'efficacité de la compilation, de la programmation asynchrone et du traitement fonctionnel des données.
Objectifs d'apprentissage :
- Identifier et décrire les quatre grandes fonctionnalités introduites par la norme C++20.
- Expliquer le rôle des Concepts et des contraintes dans l'amélioration du traitement des erreurs de templates et de la conception.
- Différencier l'approche traditionnelle basée sur les fichiers d'en-tête et le nouveau système de Modules.