Langage C++
Description
Ce stage intensif permet d'acquérir des bases solides en C++ moderne. Ce langage a en effet subi des évolutions majeures au cours des 10 dernières années, au point qu'il est difficile pour un débutant de distinguer les bonnes pratiques de celles qui sont devenues obsolètes. Pour cette raison, cette formation s'attache à véhiculer les principes clés qui guident l'évolution de C++, et ce afin de faire gagner un temps précieux au stagiaire dans son apprentissage.
Public concerné
Ce cours s'adresse aux développeurs qui souhaitent devenir rapidement opérationnels et autonomes en C++ tel qu'il devrait être utilisé aujourd'hui. A l'issue de ce cours, ils sauront mettre en œuvre ce langage dans le cadre de projets professionnels exigeants.
Objectifs de la formation
- Comprendre la programmation orientée objet, les principes d'héritage et d'encapsulation
- Créer des applications stables et performantes via une gestion robuste des ressources logicielles
- Tirer avantage des dernières normes C++ pour gagner en productivité et simplicité
- Organiser un projet C++ complexe, incluant des bibliothèques tierces et des tests unitaires
Prérequis
Connaissances de base en programmation.
Programme de la formation
Découverte du langage
- C++ depuis ses origines (langage C) jusqu'à nos jours (C++20)
- Syntaxe de base
- Fonctions et passage de paramètres
- Les tableaux et les enums
- Les types constants et les casts
- Copies, pointeurs et références
- Inférence de type avec le mot-clé auto
- Surcharge de fonctions et conversions implicites
- Créer des types utilisateur avec struct et union
- Définition d'alias avec typedef et using
- Gestion des erreurs avec les exceptions
Structuration du code
- Les namespaces
- Déclaration et définition de symboles (One Definition Rule)
- Les fonctions et variables membres
- Les fonctions et variables statiques
- Principe de const correctness
- Les opérateurs et leur surcharge
- Les modules (C++20)
Programmation orientée objet
- Classes, constructeurs et destructeurs
- Dérivation et héritage
- Visibilité et contrôle d'accès (public, protected, private)
- Mot-clé virtual et redéfinition de fonctions
- Polymorphisme et encapsulation
- Sémantique de valeur et sémantique d'entité
- Types abstraits et interfaces
- Principe de substitution de Liskov
Gestion robuste des ressources logicielles
- Défis inhérents à la gestion des ressources
- Découverte du RAII
- Différence entre le tas et la pile
- Découverte de std::string et std::vector
- Portée, durée de vie et propriété (ownership)
- Découverte des pointeurs intelligents (smart pointers)
- Transfert de propriété (move semantic)
Aperçu de la programmation générique et de la métaprogrammation
- Les différents types de polymorphisme
- Principes d'une fonction template
- Introduction aux classes template
- static_assert, constexpr et consteval (C++20)
- Découverte des templates variadic et du perfect forwarding
- Découverte de la métaprogrammation (SFINAE)
- Découverte des concepts (C++20)
Design de code C++ moderne
- Introduction aux C++ Core Guidelines
- Notions de fonction pure et de testabilité du code
- Découverte de std::optional et std::variant
- Expressions lambda et std::function
- Type erasure avec std::string_view et std::span (C++20)
- Attributs standards : [[nodiscard]], [[deprecated]]
- La règle de zéro
La bibliothèque standard
- Flux d'entrée/sortie (streams)
- Découverte de std::format() (C++20)
- Gestion du temps avec std::chrono
- Gestion de fichiers avec std::filesystem
- Principaux conteneurs de la STL
- Utilisation des algorithmes de la STL
- Programmation parallèle et concurrente (threads)
- Découverte des ranges (C++20)
Construire un projet C++ avec CMake
- Utilité d'un build system tel que CMake
- Modes de compilation Debug et Release
- Découper son projet en plusieurs composants (bibliothèques)
- Intégrer des bibliothèques externes
- Ajouter et exécuter des tests unitaires
- Effectuer une compilation conditionnelle
- Les outils pour l'optimisation, le débogage, la vérification de code