Retour aux cours
AI013 Professional

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.

4.8
30.0h
318 étudiants
2 j'aime
Intelligence Artificielle
Commencer à apprendre

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

  1. Identifier et vérifier l'environnement du compilateur C++ et l'architecture cible à l'aide d'outils en ligne de commande.
  2. Expliquer la compatibilité standard et l'historique de chevauchement entre C (C89, C99, C11) et C++ (C++98, C++1x).
  3. Mettre en œuvre un lien interlangage fonctionnel en utilisant des fichiers d'en-tête extern "C" et des flux de compilation multistages.
  4. Résoudre les ambiguïtés liées aux pointeurs à l'aide de nullptr et implémenter une logique exécutée à la compilation à l'aide de constexpr et if constexpr.
  5. Simplifier les déclarations complexes à l'aide de auto, decltype et de l'aliasing de type (using) tout en assurant une conception robuste orientée objet avec override et final.
  6. 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.
  7. Définir et implémenter des expressions Lambda en utilisant divers modes de capture (valeur, référence, expression et générique).
  8. Utiliser std::function et std::bind pour créer des enveloppes de fonctions flexibles et des applications partielles de fonctions.
  9. Catégoriser les expressions en Lvalues, Prvalues et Xvalues, et appliquer la sémantique de transfert pour optimiser la gestion des ressources des classes.
  10. Différencier les modèles de mémoire et les cas d'utilisation de std::array (taille fixe, pile) et de std::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 nullptr et implémenter une logique exécutée à la compilation à l'aide de constexpr et if constexpr.
  • Simplifier les déclarations complexes à l'aide de auto, decltype et de l'aliasing de type (using) tout en assurant une conception robuste orientée objet avec override et final.
  • 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::function et std::bind pour 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 de std::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_ptr et std::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::regex et std::smatch pour 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::mutex et 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_task et std::condition_variable.
  • Appliquer les types std::atomic et sélectionner les stratégies appropriées de std::memory_order pour 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::filesystem comme 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 int pour une précision entière étendue.
  • Appliquer le spécificateur noexcept pour optimiser le traitement des exceptions et utiliser l'opérateur noexcept pour 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.