Retour aux cours
AI037 Undergraduate

C++ Primer, Cinquième édition

Un guide complet et autoritatif sur C++, entièrement réécrit pour la norme C++11. Ce cours couvre tout, des éléments de base du langage aux fonctionnalités complexes de la bibliothèque et aux outils avancés pour la création de classes.

5.0
57.0h
601 étudiants
0 j'aime
Intelligence Artificielle
Commencer à apprendre

Aperçu du cours

📚 Résumé du contenu

Un guide complet et autoritatif sur C++, entièrement réécrit pour la norme C++11. Ce cours couvre tout, des éléments de base du langage aux fonctionnalités complexes de la bibliothèque et aux outils avancés de création de classes.

Le guide de référence incontournable pour maîtriser le développement moderne en C++11.

Auteur : Stanley B. Lippman, Josée Lajoie, Barbara E. Moo

Remerciements : Dave Abrahams, Andy Koenig, Stephan T. Lavavej, Jason Merrill, John Spicer, Herb Sutter, Bjarne Stroustrup, Alex Stepanov, ainsi que les membres du comité de normalisation.

🎯 Objectifs d'apprentissage

  1. Définir et implémenter la fonction main et comprendre son interaction avec le système d'exploitation.
  2. Exécuter la compilation en ligne de commande et gérer les flux d’entrée/sortie basiques (cin, cout).
  3. Appliquer les instructions de contrôle de flux pour résoudre des problèmes logiques itératifs, comme le comptage des occurrences.
  4. Implémenter des structures logiques pour compter et traiter des occurrences consécutives de données d’entrée.
  5. Différencier les opérateurs d’affectation (=) et d’égalité (==) dans les instructions de contrôle.
  6. Utiliser des objets de classe (Sales_item), accéder aux fonctions membres via l’opérateur point, et inclure des fichiers d’en-tête personnalisés.
  7. Distinction entre différents types primitifs et prévoir les résultats des conversions de type et des débordements arithmétiques non signés.
  8. Mettre en œuvre des fonctionnalités C++11 telles que l’initialisation par liste, nullptr, constexpr, et les spécificateurs de déduction de type.
  9. Différencier les déclarations et les définitions de variables, et appliquer les règles de portée pour gérer la visibilité des identifiants.
  10. Différencier les références et les pointeurs, et utiliser void* pour une gestion générique de la mémoire.

🔹 Leçon 1 : Introduction au C++ et entrées/sorties basiques

Aperçu : Cette leçon présente la structure fondamentale d’un programme C++, en mettant l’accent sur la fonction main, les types de données de base et le processus de compilation. Elle couvre les opérations d’entrée/sortie essentielles à l’aide de la bibliothèque iostream, l’implémentation de la logique via les boucles while et for, et conclut par une introduction aux concepts orientés objet via la classe Sales_item.

Objectifs d’apprentissage :

  • Définir et implémenter la fonction main et comprendre son interaction avec le système d’exploitation.
  • Exécuter la compilation en ligne de commande et gérer les flux d’entrée/sortie basiques (cin, cout).
  • Appliquer les instructions de contrôle de flux pour résoudre des problèmes logiques itératifs, comme le comptage des occurrences.

🔹 Leçon 2 : Flux de contrôle et concepts de base des classes

Aperçu : Cette leçon passe du contrôle de flux élémentaire à la puissance fondamentale du C++ : les classes. Les apprenants maîtriseront la logique nécessaire au traitement de flux de données (comptage des occurrences consécutives) et apprendront à utiliser la classe Sales_item pour manipuler des structures de données complexes aussi facilement que des types intégrés. La séquence se termine par la mise en œuvre d’un programme fonctionnel de librairie, intégrant la redirection de fichiers et le rapport d’erreurs.

Objectifs d’apprentissage :

  • Implémenter des structures logiques pour compter et traiter des occurrences consécutives de données d’entrée.
  • Différencier les opérateurs d’affectation (=) et d’égalité (==) dans les instructions de contrôle.
  • Utiliser des objets de classe (Sales_item), accéder aux fonctions membres via l’opérateur point, et inclure des fichiers d’en-tête personnalisés.

🔹 Leçon 3 : Types primitifs et variables

Aperçu : Cette leçon établit les briques fondamentales du développement en C++ en explorant les types arithmétiques, les cycles de vie des variables et le modèle mémoire. Les étudiants maîtriseront les subtilités des conversions de type (notamment les types non signés), la syntaxe d’initialisation par liste C++11, et les distinctions critiques entre pointeurs et références. La leçon se termine par des systèmes de types avancés incluant les qualificatifs const, la déduction de type (auto, decltype), et la mise en œuvre de structures de données personnalisées robustes à l’aide de gardes de préprocesseur.

Objectifs d’apprentissage :

  • Différencier les différents types primitifs et prévoir les résultats des conversions de type et des débordements arithmétiques non signés.
  • Mettre en œuvre des fonctionnalités C++11 telles que l’initialisation par liste, nullptr, constexpr, et les spécificateurs de déduction de type.
  • Différencier les déclarations et les définitions de variables, et appliquer les règles de portée pour gérer la visibilité des identifiants.

🔹 Leçon 4 : Types composés et qualificateurs de type modernes

Aperçu : Cette leçon explore le système de types sophistiqué de C++11, en se concentrant sur la manière dont les types composés (pointeurs et références) interagissent avec les qualificateurs de type comme const et constexpr. Les étudiants maîtriseront les subtilités de la déduction de type à l’aide de auto et decltype, et apprendront à encapsuler des données dans des structures personnalisées protégées par des gardes d’en-tête de préprocesseur.

Objectifs d’apprentissage :

  • Différencier les références et les pointeurs, et utiliser void* pour une gestion générique de la mémoire.
  • Catégoriser et appliquer les qualifications const de haut niveau et de bas niveau, ainsi que constexpr pour les constantes à compilation.
  • Mettre en œuvre la déduction de type C++11 (auto et decltype) pour écrire un code souple et maintenable.

🔹 Leçon 5 : Chaînes de caractères et vecteurs de la bibliothèque

Aperçu : Cette leçon traite des types fondamentaux de la bibliothèque standard C++ string et vector, qui offrent des alternatives plus flexibles et plus sûres aux types intégrés. Les étudiants apprendront à gérer l’accès aux espaces de noms via les déclarations using, à initialiser et manipuler des chaînes et des conteneurs de longueur variable, et à utiliser les boucles for basées sur des plages et les itérateurs pour traiter efficacement des collections de données.

Objectifs d’apprentissage :

  • Simplifier le code à l’aide des déclarations namespace using tout en évitant les pièges courants dans les fichiers d’en-tête.
  • Effectuer une initialisation robuste des chaînes et des vecteurs, y compris l’initialisation par liste C++11.
  • Mettre en œuvre un traitement au niveau des caractères et une croissance dynamique des conteneurs à l’aide de push_back, des boucles for basées sur des plages et des opérations d’itérateurs de base.

🔹 Leçon 6 : Itérateurs et tableaux intégrés

Aperçu : Cette leçon couvre les mécanismes fondamentaux pour naviguer et gérer des séquences en C++11. Elle va des outils modernes haut niveau comme les itérateurs pour string et vector aux tableaux intégrés de bas niveau, l’arithmétique des pointeurs et les chaînes de caractères de style C. Les étudiants apprendront à interagir avec du code hérité basé sur les tableaux et à gérer des structures multidimensionnelles complexes.

Objectifs d’apprentissage :

  • Utiliser les itérateurs et l’arithmétique des itérateurs pour naviguer et manipuler les conteneurs string et vector.
  • Définir, initialiser et naviguer des tableaux intégrés à l’aide de l’arithmétique des pointeurs et des fonctions bibliothèque begin/end.
  • Mettre en œuvre des opérations de chaînes de style C et interagir en toute sécurité avec les types de bibliothèque moderne.

🔹 Leçon 7 : Expressions, opérateurs et conversions

Aperçu : Cette leçon traite des blocs de construction fondamentaux des expressions C++, en se concentrant sur la façon dont le langage évalue les opérations et gère les types de données. Les étudiants maîtriseront la distinction entre les lvalues et les rvalues, les règles de priorité et d’associativité des opérateurs, et les mécanismes des opérations arithmétiques, logiques et bit à bit. En outre, la leçon offre une analyse approfondie de la gestion des types C++, incluant les conversions arithmétiques implicites et l’application sécurisée des casts nommés explicites.

Objectifs d’apprentissage :

  • Différencier les lvalues (identité d’objet) et les rvalues (valeur d’objet) et comprendre leur rôle dans les expressions.
  • Prédire l’ordre d’évaluation des expressions complexes à l’aide de la priorité, de l’associativité et de la logique de court-circuit.
  • Effectuer une manipulation de données de bas niveau à l’aide d’opérateurs bit à bit et gérer la sécurité des types grâce aux conversions implicites et aux casts nommés explicites.

🔹 Leçon 8 : Instructions avancées et gestion des exceptions

Aperçu : Cette leçon couvre les structures fondamentales de contrôle de flux C++, allant des types d’instructions simples et des règles d’emplacement à la logique conditionnelle et itérative avancée. Elle introduit également des techniques robustes de gestion des erreurs à l’aide des mécanismes de gestion des exceptions C++ et de la hiérarchie d’exceptions de la bibliothèque standard.

Objectifs d’apprentissage :

  • Différencier les instructions nulles, simples et composées, et gérer la portée des variables dans ces structures.
  • Mettre en œuvre une prise de décision complexe à l’aide des instructions if et switch, tout en résolvant des erreurs logiques comme le « else pendu ».
  • Sélectionner et appliquer la construction itérative appropriée (while, for, range for, do while) pour des tâches de programmation spécifiques.

🔹 Leçon 9 : Conception de fonctions et passage d’arguments

Aperçu : Cette leçon traite de l’architecture des fonctions C++, en mettant l’accent sur la manière dont les données sont passées vers et renvoyées depuis des blocs de code modulaires. Elle explore le cycle de vie des objets locaux, les mécanismes du passage d’arguments (par valeur vs. par référence), et la norme C++11 pour gérer des paramètres variables. Maîtriser ces concepts permet aux programmeurs d’écrire un code efficace, réutilisable et sûr en matière de mémoire.

Objectifs d’apprentissage :

  • Différencier les méthodes d’initialisation des paramètres et leur impact sur les performances et l’intégrité des données.
  • Mettre en œuvre des interfaces de fonctions robustes à l’aide des qualificatifs const, initializer_list, et des techniques de passage de tableaux.
  • Gérer efficacement la durée de vie des objets à l’aide des durées de stockage automatiques et statiques.

🔹 Leçon 10 : Fonctionnalités avancées et surcharge

Aperçu : Cette leçon traite des mécanismes complexes des fonctions C++, en se concentrant sur le passage d’arguments, la durée de vie des objets et les complexités de la surcharge de fonctions. Les étudiants maîtriseront les fonctionnalités C++11 telles que initializer_list pour les paramètres variables, les fonctions constexpr, et la déclaration et l’utilisation des pointeurs de fonction pour créer un code flexible et modulaire.

Objectifs d’apprentissage :

  • Différencier le passage par valeur et le passage par référence, et identifier les cas où utiliser des paramètres const.
  • Appliquer les règles de résolution de surcharge pour déterminer le "meilleur match" parmi les fonctions candidates et viables.
  • Mettre en œuvre et gérer des pointeurs de fonction, y compris leur utilisation dans des conteneurs comme les vecteurs et comme types de retour.

🔹 Leçon 11 : Encapsulation de classes et constructeurs

Aperçu : Cette leçon traite du passage des structures de données simples aux types abstraits de données (ADT) en C++. Elle se concentre sur les mécanismes de conception de classes, y compris les fonctions membres, le pointeur implicite this, et le rôle crucial des constructeurs dans l’initialisation des objets. Elle explore également l’encapsulation par le contrôle d’accès (public/private) et l’utilisation des « amis » pour maintenir une interface propre tout en masquant les détails d’implémentation.

Objectifs d’apprentissage :

  • Concevoir et implémenter une classe C++ (comme Sales_data) qui sépare son interface de son implémentation.
  • Maîtriser les règles d’initialisation d’objets à l’aide de constructeurs par défaut, surchargés et explicites.
  • Appliquer les spécificateurs d’accès et l’amitié pour assurer l’encapsulation et gérer la portée de la classe.

🔹 Leçon 12 : Portée de classe et gestion des conversions

Aperçu : Cette leçon traite des mécanismes avancés de conception de classes C++, en se concentrant sur la transition des structures de données simples vers des types abstraits de données (ADT) robustes. Les sujets clés incluent la gestion de l’initialisation d’objets à travers divers types de constructeurs, le contrôle des conversions implicites de type à l’aide du mot-clé explicit, et la compréhension des entités au niveau de la classe comme les membres static et les classes littérales.

Objectifs d’apprentissage :

  • Concevoir et implémenter des classes encapsulées (ADT) à l’aide de spécificateurs d’accès et de déclarations d’amitié.
  • Gérer les conversions implicites de type classe et les supprimer à l’aide du mot-clé explicit.
  • Implémenter et initialiser des membres static de classe pour une gestion centralisée des données.

🔹 Leçon 13 : Entrées/sorties par flux et bases des conteneurs séquentiels

Aperçu : Cette leçon couvre les mécanismes fondamentaux du système d’entrée/sortie de la bibliothèque standard C++ et des conteneurs séquentiels. Les étudiants apprendront à gérer les états de condition des flux et les tampons de sortie, à effectuer des entrées/sorties sur fichiers et chaînes, et à naviguer dans les conteneurs de la bibliothèque. La leçon insiste sur des concepts critiques tels que les plages d’itérateurs, l’initialisation des conteneurs et les implications de performance de la gestion de la mémoire des conteneurs.

Objectifs d’apprentissage :

  • Interroger et réinitialiser les états de condition des flux et contrôler le vidage des tampons de sortie pour gérer l’intégrité des flux.
  • Utiliser fstream et sstream pour gérer des données persistantes et en mémoire à l’aide de divers modes de fichier.
  • Choisir des conteneurs séquentiels appropriés selon les motifs d’accès et la charge mémoire pour optimiser le choix.

🔹 Leçon 14 : Opérations sur les conteneurs et algorithmes génériques

Aperçu : Cette leçon traite de la gestion des conteneurs séquentiels C++ et de l’application d’algorithmes génériques pour traiter les données indépendamment du type de conteneur. Elle explore comment les conteneurs gèrent la croissance mémoire et le cycle de vie des éléments, ainsi que l’utilisation des lambdas et des binders de fonctions pour personnaliser les algorithmes de bibliothèque. Les étudiants maîtriseront l’architecture de la bibliothèque, y compris les catégories d’itérateurs et les algorithmes spécialisés.

Objectifs d’apprentissage :

  • Gérer les cycles de vie des conteneurs à l’aide d’opérations spécialisées pour forward_list, des techniques de redimensionnement, et de la gestion de la capacité de vector.
  • Effectuer des manipulations complexes de chaînes et des conversions numériques à l’aide de la bibliothèque string étendue et des adaptateurs de conteneurs.
  • Implémenter des algorithmes génériques pour lire, écrire et réorganiser les données tout en personnalisant le comportement à l’aide de prédicats, d’expressions lambda et de std::bind.

🔹 Leçon 15 : Conteneurs associatifs et pointeurs intelligents

Aperçu : Cette leçon traite de la norme C++11 pour les conteneurs associatifs et la gestion de mémoire dynamique. Elle détaille l’utilisation de conteneurs ordonnés et non ordonnés pour une récupération efficace par clé, et l’implémentation de code robuste et sûr aux exceptions à l’aide de pointeurs intelligents. La leçon se termine par la conception d’une application réelle de recherche de texte qui intègre ces structures de données complexes.

Objectifs d’apprentissage :

  • Implémenter et manipuler des conteneurs associatifs en utilisant des techniques efficaces de recherche, d’insertion et d’accès par indice.
  • Maîtriser la gestion de mémoire dynamique en passant du new/delete manuel à des pointeurs intelligents basés sur RAII et à la classe allocator.
  • Concevoir des systèmes complexes qui partagent des données de manière sûre entre classes à l’aide du comptage de références et de la possession par pointeur intelligent.

🔹 Leçon 16 : Gestion des ressources et sémantique de mouvement

Aperçu : Cette leçon explore comment les classes C++ contrôlent le cycle de vie de leurs ressources à travers les cinq fonctions membres spéciales « Big Five ». Les étudiants apprendront à gérer la mémoire dynamique à l’aide de stratégies de type valeur et de type pointeur, à implémenter l’idiome copie-échange sûr aux exceptions, et à optimiser les performances à l’aide de la sémantique de mouvement C++11 et des références rvalue.

Objectifs d’apprentissage :

  • Implémenter et expliquer la règle des Trois/Cinq pour garantir une gestion appropriée des ressources et prévenir les fuites de mémoire.
  • Différencier les comportements de classe de type valeur et de type pointeur, et implémenter le comptage de références.
  • Appliquer la sémantique de mouvement à l’aide de références rvalue et de std::move pour éliminer les copies profondes inutiles d’objets volumineux.

🔹 Leçon 17 : Surcharge d’opérateurs et héritage (POO)

Aperçu : Cette leçon explore l’extension de la syntaxe du langage par la surcharge d’opérateurs et la construction de systèmes extensibles via la programmation orientée objet (POO). Les étudiants apprendront à concevoir des classes qui s’intègrent aux opérations intégrées tout en maîtrisant les mécanismes d’héritage, de liaison dynamique et des hiérarchies de classes polymorphes.

Objectifs d’apprentissage :

  • Concevoir et implémenter des opérateurs surchargés conformes aux conventions de la bibliothèque standard C++.
  • Créer et utiliser des objets fonctionnels et le wrapper de type function pour unifier les entités appelables.
  • Construire des hiérarchies d’héritage robustes à l’aide de fonctions virtuelles, de classes abstraites de base et des spécificateurs d’accès C++11.

🔹 Leçon 18 : Modèles et programmation générique

Aperçu : Cette leçon traite des mécanismes fondamentaux et avancés des modèles C++, fournissant la base de la programmation générique. Les étudiants passeront de la définition de modèles de fonction et de classe de base à la maîtrise des fonctionnalités spécifiques C++11 telles que les modèles variadiques, le transfert parfait et la spécialisation de modèles.

Objectifs d’apprentissage :

  • Définir et instancier des modèles de fonction et de classe en utilisant à la fois des paramètres de type et des paramètres non typés.
  • Gérer le modèle de compilation de modèles et contrôler l’instanciation sur plusieurs fichiers à l’aide de extern template.
  • Implémenter des techniques avancées de déduction, y compris les types de retour en queue et le transfert parfait avec std::forward.

🔹 Leçon 19 : Outils avancés de bibliothèque et grands systèmes

Aperçu : Cette leçon traite des composants avancés de la bibliothèque standard C++11 et des fonctionnalités linguistiques conçues pour le développement de systèmes complexes. Elle couvre des structures de données spécialisées, des correspondances de motifs robustes via la bibliothèque regex, et des outils architecturaux pour la programmation à grande échelle. Elle explore également la gestion avancée des exceptions, la gestion des espaces de noms et les complexités de l’héritage multiple.

Objectifs d’apprentissage :

  • Utiliser tuple pour retourner plusieurs valeurs et bitset pour une gestion efficace des indicateurs au niveau des bits.
  • Mettre en œuvre des correspondances de motifs complexes, la validation et la transformation de chaînes à l’aide de la bibliothèque regex.
  • Générer des nombres aléatoires de haute qualité à l’aide de moteurs et de distributions tout en maintenant un état et une initialisation corrects.