Master Informatique - Université de Lyon - Université Claude Bernard
M1IF23 - Automne 2025
Programmation Avancée, Spécificités du C++
Organisation
:
- Créneaux organisés les jeudis et vendredi après-midi quand les alternants sont en entreprise.
- Il y a 7 groupes de TPs pour l'instant, mais ce nombre pourra évoluer. Vous trouverez votre groupe dans TOMUSS. Merci de respecter votre affectation.
-
Les CMs et les TPs sont en présentiel.
Il s'agit d'une UE exigeante en ce qui concerne votre implication et votre participation.
- Evaluation :
- Un TP noté à la toute dernière séance de TP de l'UE, sur un sujet surprise, le jeudi 18 décembre 2025, pour évaluer vos capacité de prise en main d'un sujet en temps limité. Vous n'aurez probablement pas le temps de tout faire.
Pour ce TP, les seuls documents autorisés seront les slides du cours et les sujets de TP, mais pas les corrections fournies. Cela pourra vous être utile pour les questions de syntaxe, puisque vous n'aurez pas droit à une documentation en ligne.
- Une interrogation sur feuille portant sur le même sujet que celui du TP noté aura lieu le 15 janvier 2026 (à confirmer) .Vous aurez eu le temps d'approfondir le sujet et vous aurez à répondre à quelques questions, pour illustrer votre compréhension du sujet et votre capacité d'aller plus loin. Attention : le sujet de TP noté vous
sera redonné sous forme papier, mais vous n'aurez pas droit à l'archive que vous aurez rendue à la fin du TP noté.
- Une interro finale qui aura lieu le même jour que l'interrogation sur papier.
Vous pouvez vous entraîner à faire le sujet qui est placé sur la page web du cours. Là encore, vous n'aurez droit à aucun document. L'UE ne nécessite pas à connaitre tous les éléments de la bibliothèque standard mais à comprendre le coeur du langage.
Emploi du temps : http://master-info.univ-lyon1.fr/M1/#24. Les salles sont
indiquées dans l'ordre des groupes G1, G2, G3, G4, G5, G6 et G7. Attention, vous n'aurez pas de cours de Programmation Avancée le vendredi 24 octobre 2025, mais vous pourrez profiter des salles réservées pour travailler.
Cours :
Plan donné à titre indicatif. Il pourra y avoir des modifications dans le déroulement du cours et la composition des séances. Nous n'aurons probablement pas le temps d'aborder les notions indiquées en grisé, mais n'hésitez pas à les regarder pour compléter vos connaissances.
Cours 1
: Mise à niveau et objectifs
- Objectifs du cours
- Premières différenciations entre C++ et Java
- Retour sur la notion de référence
- Introduction à la notion de value-ness
(lvalue, rvalue, xvalue)
- Héritage comme outil de spécialisation
- Différents types d'héritages
(public, protected, private)
et leur intérêt
- upcast implicite et downcast explicite (static_cast)dans une hiérarchie de classes
- Mot clé using
- Nuance avec l'héritage en Java
Cours 2 : Héritages et constructeurs, rvalue references, déplacement, objets fonctions
- Héritage comme outil de spécialisation
- Mot clé using
- Constructeurs des classes dérivées (=default,=delete)
- Destructeur et affectation (operator=) des classes dérivées
- Capsules RAII
- Exploitation des xvalues
- rvalue reference &&
- Constructeur par déplacement, affectation par déplacement
- changement de sémantique du move
-
Rule of 3, Rule of 5
Cours 3
: Objets fonctions, Généricité dynamique, polymorphisme
- Quelques compléments sur les classes et leurs éléments de contrôle
- Fonctions et classes amies friend
- Qualificatif explicit
- Objets fonctions
- Redéfinition de fonction et polymorphisme en Java
- Redéfinition de fonction membre vs. surcharge, override en C++
- Principe du masquage en C++ vs en Java
- Type statique vs. type dynamique
- Généricité dynamique en C++
- mot clef virtual
- analyse statique et liaison dynamique
- nuance entre fonction membre et méthode
- Coût du polymorphisme
- table des fonctions virtuelles
- Mot clé final (Java, C++)
Cours 4
: Généricité dynamique, RTTI, Sémantique des casts en C++,
- Constructeurs non polymorphes, fonctions membres virtuelles de clonage
- Polymorphisme et destructeurs
- Fonctions virtuelles pures et classes abstraites
- Interfaces vs. classes abstraites
- RTTI
- typeid et dynamic_cast
- Retour sur les opérateurs de transtypage du C++ (static_cast, dynamic_cast, const-cast, reinterpret-cast)
Cours 5
: Limites du polymorphisme dynamique, Généricité statique
- limites du polymorphisme, polymorphisme sur plusieurs arguments
- Fonctions et classes template
- Specialisation totale (classes et fonctions template) ou partielle (classes template uniquement)
- Fonctions et données membres statiques
- Difference entre les template Java et les template C++
- Rappels sur tous les éléments qui peuvent être définis dans le scope d'une classe (template ou non)
- Mot clé using comme une alternative a typedef
Cours 6 : Standard Template Library
- Présentation de la STL et explications sur son implémentation interne
- Concept de Conteneur
- Conteneur séquentiel
- Conteneur associatif
- Objets Fonctions de la STL
- Opérateurs associés à un itérateur
- Itérateurs de parcours des conteneurs séquentiels
- Concept d'Algorithme générique
- Indépendance au conteneur
- Algorithmes génériques de la STL
- Concepts plus récents de range et de view
Cours 7 : Allocation dynamique personnalisée, Pointeurs intelligents,
- Surcharge de new et delete
- Allocateur d'une classe
- Principe
et implémentation des pointeurs intelligents
- auto_ptr,
unique_ptr,
scoped_ptr,
- shared_ptr,
intrusive_ptr,
- weak_ptr,
Cours supplementaire non fait en séance : Héritage multiple, exception
- Héritage multiple : gestion par le langage C++
Héritage virtuel (Slides 13 à 17), polymorphisme et héritage virtuel
- Exceptions
: gestion par le langage C++ assez similaire à ce qui est fait en Java.
Cours 8 : Métaprogrammation
- Possibilités offertes par le compilateur (en complément preuve de Turing completude des template C++)
- Mise en oeuvre d'un métaprogramme (enum et constantes statiques dans des classes, fonctions templates, constexpr, inline)
- Template numérique, Listes de Types,
- CRTP principe et exemples d'utilisations
- Génération automatique d'une hiérarchie de types Visiteur (difficile)
- static_assert
- Concept depuis C++20
Cours 9 : Fin cours 08 + Les évolutions de C++ depuis C++11 et notamment les concepts
- Retour sur certains des apports de C++11, C++14 et C++17.
- Inférence de type, auto, decltype
- Valueness, référence universelle
- std::move, std::forward, std::ref
- Template variadique, tuple
- Lambda expression
- Alias template
- Concept checking : Notion de concept (C++20) évoquée dans le cours 05
- Les éléments qu'on aurait également pu voir :
- Namespace
- Construction de nouvelles fonctions par binding
de fonctions existantes
- Illustration de decltype
(C++14) dans des cas
où on ne pourrait pas s'en
passer
Et tant
d'autres choses!
TPs :
Les liens sur les TPs deviendront valides au fur et à mesure des séances.
Le contenu des TPs est donné à titre indicatif et peut évoluer d'une année à l'autre.
- TP01 :
Rappels constructeurs, destructeurs, surcharges opérateurs et conversions
- Premières différences entre Java et C++ concernant les classes de bases
- Pour ceux qui n'auraient pas encore installé de compilateur
C++, voici un compilateur en ligne : http://cpp.sh/
- Pour ceux qui n'auraient pas encore installé d'interpréteur
JAVA, voici un compilateur en ligne : https://www.jdoodle.com/online-java-compiler
- Pour ceux qui n'ont aucun compilateur : connaissez-vous Godbolt? J'adore ;-)
- Pour réaliser des mesures de temps vous pouvez utiliser la commande time avec le nom de votre exécutable en argument. Sinon vous pouvez recourir à la bibliothèque chrono du C++ (classe std::chrono::time_point pour faire des mesures en microsecondes) et à la méthode System.currentTimeMillis() en Java (exemple).
- TP02 :
Constructeurs, destructeurs, capsule RAII, déplacement,
affectation des classes dérivées, upcast et downcast, écriture d'une classe String
-
Eléments de correction sur LaClasse pour comprendre ce qui se passe à chaque instruction.
- Eléments de correction sur la dérivation de LaClasse et l'ajout de mécanismes de déplacement (constructeurs et affectation par déplacement)
- Attention, pour écrire la classe String, vous aurez besoin
d'allocation dynamique de la mémoire.
- Attention, pour écrire la classe String, vous aurez besoin d'allocation dynamique de la mémoire.
- TP03 : Objets
fonctions, Polymorphisme
- Fin des TPs précédents
- Codage d'un objet fonction
- Retour sur la classe Image et le comparatif de performance
C++ et Java
- TP04 : Polymorphisme
- Hiérarchie de classe expression (éléments de solution)
- Fonction membre virtuelle de clonage
- Codage d'un objet fonction
- TP05 : Template
- Class Template Tableau (éléments de correction, éléments de correction supplémentaires avec la
possibilité de traiter conjointement des tableaux avec des
agrandissements de taille différente)
- TP06 : Template,
itérateurs et STL
- Class Template ListeTriee
- Iterateur sur Tableau (plusieurs implémentations possibles, en voyez vous-une qui n'invalide pas les itérateurs quand la capacité du tableau augmente?)
- Utilisation de la STL et de ses algorithmes (éléments de correction)
- TP07 : Template, itérateurs, Inserteurs, déplacement
- Class Template Tableau et ListeTriee
- Iterateur sur tableau et sur ListeTriee (éléments de correction).
- Inserteur sur tableau et sur ListeTriee (éléments de correction sur les slides du cours sur la STL)
- Déplacement dans la hiérarchie de classe expression (éléments de correction : avec constructeur par copie et par déplacement, ou sans).
- Ceux qui ont tout terminé peuvent s'attaquer à l'exemple de sujet de TP noté fourni plus bas.
- TP08 et 09 : Métaprogrammation, Const_cast
- Listes de types et métafonctions permettant de les manipuler (correction en utilisant le mécanisme basique des template du compilateur C++, correction utilisant les template variadiques offerts par C++ depuis C++11)
- Mieux comprendre l'utilité des const et utilisation de const_cast (correction).
- Métaprogrammation pour la génération de hiérarchie de classes polymorphes (exercice difficile et facultatif).
- TP Noté (voir instructions plus bas).
Exemple de sujet portant sur les Arbres Binaires de Recherches et leurs itérateurs
Examen :
Pour vous entrainer, voici un exemple d'interro
finale et de QCM (première session).
Nous vous recommandons surtout de bien relire vos cours, de refaire les
exemples et de revenir sur l'ensemble des exos posés en TP.
BIEN REGARDER LES ELEMENTS DE CORRECTION PLACES SUR LE SITE WEB DU COURS
TP noté :
Le TP noté sera à faire en monome. Vous trouverez dans Tomuss, la salle à laquelle vousêtes affectés.
Vous aurez uniquement droit :
* à une page de votre navigateur ouverte sur Tomuss, aucun autre accès réseau n'est autorisé (pas de git, pas de chat, pas de cppreference, pas d'accès à la page du cours, etc...)
* à un lecteur de pdf ouvert sur les slides du cours ainsi que sur les sujets de TP de l'UE (vous pouvez également disposer d'une version imprimée). VOUS NE DISPOSEZ EN REVANCHE PAS DES CORRECTIONS.
* à votre éditeur préféré ouvert sur un projet vide
Cela signifie que vous n'aurez pas droit à internet ni à vos codes écrits précédemment, ni à des ouvrages imprimés autres que les documents du cours. Votre application de mail ou de tchat devra également être fermée, ainsi que votre téléphone portable.
Attention : Le chargé de TP pourra vérifier en cours de séance que vous respectez bien ces règles. Votre écran doit rester visible tout le temps de la séance.
Regardez dans Tomuss à quelle salle vous serez affectés pour composer votre TP noté.
A la fin de la séance vous devrez déposer une archive de votre travail sur Tomuss :
* Attention de ne mettre que les .h et .cpp (si possible avec un Makefile).
* L'archive (.zip ou .gz ou .tgz) que vous déposez DOIT porter votre nom.
Bibliographie :
- The C++ Programming Language,
Bjarne Stroustrup, 3. Auflage, Addison-Wesley, 1997, (existe en version française)
- Le langage et la bibliothèque C++, Norme ISO
Henri Garetta, Ellipse, 2000
- C++ Primer, Lippman & Lajoie,
Third Edition, Addison-Wesley, 1998
- Effective C++,
Scott Meyers, Second Edition, 1998
- The Design and Evolution of C++,
Bjarne Stroustrup, 1994
- The ISO/IEC C++ standard,
American National Standards Institute, First Edition, 1998
- Modern C++ Design: Generic Programming and Design Patterns Applied
Andrei Alexandrescu. . ISBN: 0201704315, Boston, MA: Addison-Wesley, 2001
- Pour mieux développer avec C++ : design Patterns, STL, RTTI et smart pointers
Aurélien Géron, Fatmé Tawbi, Dunod, ISBN 2 10 004835 X
- C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond
by David Abrahams; Aleksey Gurtovoy
Enseignants:
- Cours
- Chargés de TP
- Bollinger Charly
- Chaine Raphaëlle (raphaelle.chaine(à)liris.cnrs.fr)
- Deschamps Quentin (quentin.deschamps(à)liris.cnrs.fr)
- Doignies Bastien (bastien.doignies(à)liris.cnrs.fr)
- Iehl Jean-Claude (jean-claude.iehl(à)liris.cnrs.fr)
- Schott Hugo (hugo.schott(à)liris.cnrs.fr)
- Thévenon Gaspard (gaspard.thevenon(à)liris.cnrs.fr)