Le langage C++

Cette page donne quelques ressources pour le module de Prog2 de l’ENS Rennes. Si vous avez des questions, n’hésitez pas à contacter Martin Quinson ou Killian Barrere.

Les prérequis du module sont une bonne compréhension du langage C (module Sys1 du premier semestre), une bonne maîtrise de l’algorithmique (Algo1 et Algo2 cette année) et une certaine connaissance de la programmation fonctionnelle (module Prog1 au premier semestre). Une première exposition aux objets en Java ou Python est un plus, mais ce n’est pas indispensable.

L’objectif du module est de donner une bonne maîtrise du langage C++. Le temps imparti ne permet pas de couvrir l’intégralité de ce langage si vaste et complexe, mais nous couvrirons les bases du langage (STL, flux, templates, surcharge d’opérateurs), la norme C++11 (RAII, smart pointers) et nous aborderons quelques points de la norme C++23 (ranges). Nous verrons également comment organiser un projet selon les cannons de la programmation orientée objet (polymorphisme, dispatch, covariance, classes et héritage), ainsi que l’implémentation classique de ces concepts en C++ (vtable, name mangling et schémas mémoires). Si le temps le permet, nous aborderons des notions plus avancées de génie logiciel (test, intégration continue).

Polycopié du cours

En vérité, les documents de cours ne sont pas exactement des polycopiés. Il s’agit plutôt de mes notes de cours : c’est ce que j’utilise en séance pour structurer mon discours et ne rien oublier. Je n’utilise pas toutes les sections à l’oral (en fonction du temps disponible), et je change parfois l’ordre des parties en live (en fonction de mon inspiration et des retours de l’assistance).

Cela fait que le texte est concis, car j’ai besoin de pouvoir m’y repérer en live pendant que je parle en cours. S’il y a trop de lettres, je risque de m’y perdre. Il sera donc rapide à relire pour vous aussi, si vous savez de quoi il retourne. En revanche, ce document n’est pas suffisamment rédigé pour être auto-suffisant et vous permettre de tout comprendre sans venir en cours.

Voir aussi les extraits de code distribués chaque semaine ci-dessous.

Séance 1: Better C

L’objectif de cette semaine est de présenter les améliorations de C++ par rapport au C, en se limitant aux aspects de programmation impérative. On parlera donc de std::string, des flux d’entrée/sortie, des références, de la bibliothèque standard (les conteneurs, les itérateurs et les algorithmes), et des templates de fonction.

Séance 2: Introduction à la POO

Cette semaine, on aborde le second paradigme de programmation utilisable en C++ : la programmation orientée objet. Nous parlerons d’encapsulation, de constructeurs, de const et static, de surcharge d’opérateurs et d’objets automatiques, temporaires ou dynamiques. Nous nous attacherons à comprendre comment ce paradigme peut aider à mieux organiser son code, en pratique.

Séance 3: Héritage de classes

On continue avec l’OOP en parlant d’héritage, de liaison dynamique, de compatibilité de classes, d’exceptions et de transtypage.

Séance 4: Implémentation du C++

Cette semaine, nous nous interressons à l’implémentation du C++, en particulier la représentation des classes et objets en mémoire (memory layout) et la décoration des noms de méthodes (name mangling). C’est important pour comprendre ce qui se passe quand on redéfinit une méthode dans une classe fille (overriding), ce qui se passe quand on surcharge une fonction (overloading), et quelle est cette horreur nommée réécriture de méthode (overwriting).

Séance 5: covariance et C++ moderne

Cette semaine, nous pouvons terminer notre revue de l’héritage en C++ avec les notions de covariance, invariance et contravariance. Cela donne de beaux casses-têtes, particulièrement difficile à comprendre sans les notions abordées depuis 3 séances sur l’héritage en C++.

Dans un second temps, nous étudierons les fonctionnalités “modernes” du C++ permettant de ne plus gérer à la main les ressources systèmes comme la mémoire. Ca n’égale peut-être pas le borrow checker de Rust, mais c’est déjà bien plus pratique que de tout faire à la main comme en C.

Séance 6: Programmation fonctionnelle en C++

Cette semaine, nous verrons certains élément se programmation fonctionnelles ajoutés au C++ dans les dernières versions du langage. Au programme: lambdas et ordre supérieur, pureté et immutabilité, ranges et views. Nous parlerons aussi un peu de programmation générique et de templates si le temps le permet.

Séance 7: Conclusion

Ancien projet

Les années passées, nous avions une semaine de projet de C++, à faire sur une semaine à plein temps par groupes de 4 élèves. Il est bien trop gros pour être réalisé par un.e seule élève sur son temps libre, mais l’énoncé est donné ici pour référence. Le but de ce projet est de réaliser un jeu de combat entre des petits robots, librement inspiré de diep.io. Il y aura de la programmation orientée objet, de l’algorithmique, un peu de réseau, un peu de graphisme et même un peu d’intelligence artificielle (mais sans deep learning, malgré le titre). Sujet du projet, template de projet gitlab. On peut télécharger le source fourni sans passer par notre gitlab.

Quelques ressources utiles

On trouve énormément de choses sur internet, et voici une petite sélection de ressources intéressantes portant sur le C++ moderne.

Examens des années passées

Le module est assez jeune et il n’y a pas beaucoup d’épreuves passées

Autres cours

Ce module fait partie d’un ensemble relativement cohérent d’enseignements à l’ENS Rennes:


Merci de signaler toute erreur sur framagit (vous devez être authentifié sur framagit pour cela).
Les collègues enseignants peuvent demander un accès “Guest” au projet (directement sur l’interface gitlab), pour accéder aux sources et corrigés (qui sont masqués surtout pour cacher les examens avant le jour J).