Tous droits réservés

La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

Bienvenue dans ce cours sur l’apprentissage de la programmation avec le langage C++. Vous débutez complètement et n’avez qu’une vague idée de ce que peut bien être la programmation ? On vous a dit d’en apprendre plus sur le C++ ? Alors ce tutoriel est fait pour vous.

Pour rendre ce cours pédagogique, nous alternerons entre théorie, explications et détails techniques d’un côté et exercices, travaux pratiques et questions-réponses de l’autre. L’accent sera mis sur la rigueur, la qualité et les bonnes pratiques. Le rythme sera progressif, chaque concept étant introduit en temps voulu et en lien avec ce que nous aurons déjà vu.

Prérequis

Prérequis
Lire cette introduction à la programmation afin d’avoir des bases pour aborder l’apprentissage du C++.

Objectifs
Vous former à la programmation en vous donnant des bases solides sur lesquelles continuer.
Vous former au C++ moderne.

Remerciements

Car ce cours n’aurait jamais pu voir le jour sans l’aide et le soutien de plusieurs personnes.

  • Un merci particulier à @gbdivers pour son cours Débuter en C++ moderne qui aura été une source d’inspiration pour l’écriture du présent cours, à qui nous avons emprunté plusieurs passages très bien écrits et qui n’aura cessé de nous aider à améliorer ce cours par ses nombreuses remarques et suggestions.
  • Tous les membres qui ont participé à la bêta et qui ont grandement aidé à améliorer la qualité de ce tutoriel, par leurs nombreuses remarques, suggestions et corrections. Toutes vos participations, petites et grandes, nous ont été extrêmement précieuses et utiles pour produire un cours meilleur.
  • Toute l’équipe de Zeste de Savoir ; en particulier, un grand merci à @Taurre et @Glordim qui se sont chargés de la validation.
  • Et l’ensemble des lecteurs, pour avoir choisi ce cours.
À venir

La partie POO est toujours en rédaction. Les mises à jour viendront au fil de l’eau.

Le début du voyage

  1. Le C++, qu'est-ce que c'est ?

    1. Petite mise au point

    2. Tour d'horizon du C++

    3. La documentation

  2. Le minimum pour commencer

    1. Des outils en ligne

    2. Des outils plus poussés

    3. Un mot concernant Windows

    4. Un mot concernant GNU/Linux

  3. Rencontre avec le C++

    1. Compilons notre premier programme

    2. Démystification du code

    3. Les commentaires

  4. Une super mémoire

    1. Les littéraux

    2. Les variables

    3. Qu'en déduisez-vous ?

    4. Les entrées

  5. Le conditionnel conjugué en C++

    1. Les booléens

    2. if — Si, et seulement si…

    3. else — Sinon…

    4. else if — La combinaison des deux précédents

    5. Conditions imbriquées

    6. [T.P] Gérer les erreurs d'entrée — Partie I

    7. La logique booléenne

    8. Tester plusieurs expressions

    9. Exercices

  6. Des boucles qui se répètent, répètent, répètent…

    1. while — Tant que…

    2. Exercices

    3. do while — Répéter … tant que

    4. [T.P] Gérer les erreurs d'entrée — Partie II

    5. for — Une boucle condensée

    6. Boucles imbriquées

    7. Convention de nommage

    8. Contrôler plus finement l'exécution de la boucle

  7. Au tableau !

    1. Un tableau c'est quoi ?

    2. std::vector — Mais quel dynamisme !

    3. Exercices

    4. std::array — Le tableau statique

    5. std::string — Un type qui cache bien son jeu

  8. Déployons la toute puissance des conteneurs

    1. Le socle de base : les itérateurs

    2. Des algorithmes à gogo !

    3. Personnalisation à la demande

    4. Exercices

  9. Des flux dans tous les sens

    1. Avant-propos

    2. std::ofstream — Écrire dans un fichier

    3. std::ifstream — Lire dans un fichier

    4. Exercice

    5. Encore plus de flux !

On passe la deuxième !

  1. Découpons du code — Les fonctions

    1. Les éléments de base d'une fonction

    2. Exercices

    3. Quelles sont vos références ?

    4. Nos fonctions sont surchargées !

    5. [T.P] Gérer les erreurs d'entrée — Partie III

    6. Dessine-moi une fonction

  2. Erreur, erreur, erreur…

    1. L'utilisateur est un idiot

    2. À une condition… ou plusieurs

    3. Le développeur est un idiot

    4. Les tests unitaires à notre aide

    5. [T.P] Gérer les erreurs d'entrée — Partie IV

    6. L'exception à la règle

    7. [T.P] Gérer les erreurs d'entrée — Partie V

  3. Des fonctions somme toute lambdas

    1. Une lambda, c'est quoi ?

    2. Syntaxe

    3. Exercices

    4. On va stocker ça où ?

    5. Paramètres génériques

    6. [T.P] Gérer les erreurs d'entrée — Partie VI

    7. [T.P] Gérer les erreurs d'entrée — Partie VII

    8. Capture en cours…

  4. Envoyez le générique !

    1. Quel beau modèle !

    2. [T.P] Gérer les erreurs d'entrée - Partie VIII

    3. Instanciation explicite

    4. Ce type là, c'est un cas !

  5. De nouvelles structures de données

    1. struct — Un agrégat de données

    2. std::tuple — Une collection hétérogène

    3. std::unordered_map — Une table associative

    4. std::unordered_set — Représenter un ensemble

    5. Un peu d'ordre, voyons !

    6. Une longue énumération

  6. Reprendrez-vous un peu de sucre syntaxique ?

    1. Ce type est trop long !

    2. Décomposons tout ça

    3. La surcharge d'opérateurs

  7. [T.P] Un gestionnaire de discographie

    1. L'énoncé

    2. Guide de résolution

    3. Corrigé complet

    4. Conclusion et pistes d'améliorations

  8. Découpons du code — Les fichiers

    1. Le principe

    2. La sécurité, c'est important

    3. Découpons le TP !

    4. Les avantages du découpage en fichiers

    5. Le cas des templates

Interlude - Être un développeur

  1. Avant-propos

    1. Ce que nous avons appris

    2. Différents paradigmes

    3. Brancher le cerveau avant tout

    4. Savoir se débrouiller

  2. Mais où est la doc ?

    1. Lire une page de doc

    2. Exercices

    3. Documenter son code avec Doxygen

    4. Quelques bonnes pratiques

  3. Compilation en cours…

    1. Le préprocesseur

    2. La compilation

    3. Le linker

    4. Schéma récapitulatif

  4. Chasse aux bugs !

    1. Le principe

    2. Un code d'exemple

    3. Visual Studio

    4. Qt Creator

    5. En ligne de commande avec gdb

  5. Une foule de bibliothèques

    1. Quelles bibliothèques choisir ?

    2. Généralités

    3. Installer Boost

    4. Installer SFML

  6. Améliorer ses projets

    1. git — Sauvegarder et versionner son code

    2. GitHub — Partager son code

    3. CMake — Automatiser la compilation de nos programmes

    4. Aller plus loin

La Programmation Orientée Objet

  1. Premiers pas avec la POO

    1. Le principe : des objets bien serviables

    2. Un peu de vocabulaire

    3. En C++, ça donne quoi ?

    4. Désolé, cet objet n'est pas modifiable

    5. On ne fait pas d'exception

    6. Découpage en fichiers

    7. Exercices

  2. Qui c'est qui va construire tout ça ?

    1. Encapsulation et invariants

    2. On cherche un constructeur

    3. Constructeur par défaut

    4. Soyons explicites

    5. En toute amitié

    6. Exercices

  3. Une classe de grande valeur

    1. Une histoire de sémantique

    2. La sémantique de valeur, c'est quoi ?

    3. Égalité

    4. Le retour des opérateurs

    5. Copier des objets

  4. [T.P] Entrons dans la matrice !

    1. Qu'est-ce qu'une matrice ?

    2. L'énoncé

    3. Correction détaillée

    4. Aller plus loin

Annexes

  1. Index



Ce cours s’achève ici, mais votre apprentissage du C++ est loin d’être terminé. Il reste encore beaucoup de choses à apprendre. Vous pouvez commencer par les contenus C++ disponibles sur Zeste de Savoir. Certains approfondissent des concepts que nous avons introduits dans ce tutoriel, d’autres vous présenteront des notions nouvelles. Enfin, pour continuer votre apprentissage, voici quelques derniers conseils.

  • Soyez curieux : fouillez sur Internet pour découvrir de nouvelles méthodes, approfondissez celles que vous connaissez, renseignez-vous, testez de nouveaux outils, lisez des bons livres, etc.
  • Entrainez-vous : c’est le meilleur moyen de progresser. Faites des projets qui vous tiennent à cœur, mettez en œuvre des algorithmes connus, réalisez des exercices, participez au code des autres, etc.
  • Lisez des codes produits par d’autres personnes : découvrez comment elles procèdent, apprenez d’elles de nouvelles techniques ou façons de faire et progressez en suivant leurs conseils. Vous pouvez par exemple commencer en visitant les forums de ce site.
  • Enfin, le plus important : amusez-vous ! ;)

138 commentaires

Salut, Toujours rien en rapport avec le fonctionnement des pointeurs dommage.

Je trouve ça bizarre que vous n’ayez pas aborder se sujet avant justement les object. car la particularité du C est justement de permettre au programmeur d’apprendre la gestion de la mémoire si je me trompe pas.

en aucun cas le sujet y est abordé. allez-vous en parler, sinon quel livre conseillerais vous ?

En fait, beaucoup de choses de ce cours concerne la gestion de la mémoire. Et les pointeurs commencent a etre introduit dans la partie en cours de rédaction https://zestedesavoir.com/forums/sujet/3703/la-programmation-en-c-moderne/.

Le problème est justement que l’approche historique du C++ fait croire aux débutants que la gestion de la mémoire, c’est les pointeurs. Parce qu’en C, c’est effectivement la seule (ou presque) manière de gérer la mémoire. Mais pas en C++.

Un autre problème des approches historiques, c’est qu’elles se concentrent sur l’apprentissage des syntaxes, pas de la qualité du code. Et les pointeurs sont un piège a bug. Beaucoup de cours basés sur une approche historique enseignent mal les pointeurs.

Dans un approche moderne du C++, il n’est pas surprenant que les pointeurs soient introduit plus tard, quand on a vu les autres outils plus safe avant.

+7 -0

Hello,

N’y a-t-il pas un souci à cet endroit : https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/decoupons-tout-ca/decoupons-du-code-les-fonctions/#le-probl%C3%A8me

Je ne comprends pas bien comment est_pair et est_impair peuvent fonctionner, en sachant que la seule valeur que peut renvoyer les deux fonctions, c’est true et jamais false. Surtout que mon compilateur me renvoie une erreur type "Stack overflow" quand je donne un nombre impair à est_pair. Enfin, j’avoue que je suis un peu perdu là…

Merci !

Mon petit doigt me dit que l’un des auteurs sera présent au prochain meeting du C++ French User Group, le 27 septembre (en ligne et gratuit).

Pour les détails et s’inscrire : https://www.meetup.com/fr-FR/User-Group-Cpp-Francophone/events/280843919

Benoît est un informaticien passionné par le partage et la qualité. Ayant appris au contact des autres et ayant pu s’améliorer grâce à leur aide et leurs conseils, il s’efforce de faire de même et de partager largement ce qu’il sait pour que d’autres en profitent. Dans l’optique d’aider les débutants à apprendre correctement le C++, il s’est lancé dans le projet d’écrire "Le Guide du C++ moderne" pour que le public francophone puisse bénéficier d’un ouvrage à jour, simple, progressif, tout en enseignant les bonnes pratiques. Il est aussi présent sur Zeste de Savoir, le site libre et gratuit de partage et d’entraide.

N’hésitez à venir montrer que la communauté de Zeste de Savoir est présente !

+3 -0

Bonjour, je suis nouveau, en faite je viens de OpenClassRoom j’y ai suivis le cour en C++ qui malheureusement est très obselete… bref je m’y tarde pas Alors voilà je voudrai savoir est il possible de télécharger ce cours en PDF Si oui, comment le faire ?

Bonjour, Quelle est la différence entre ce cours et le livre "Le guide du C++ moderne – De débutant à développeur" ?

kamelitoloveless

Bienvenu sur Zeste de Savoir. :)

Le livre est une version revue et augmentée du cours que tu peux lire ici. La partie POO a notamment été réécrite.

informaticienzero

Merci du retour et du message de bienvenue. J’ai essayé plusieurs fois d’apprendre le C++ (C++98) et j’ai trouvé les livres sur le sujet très difficiles à lire et donc comprendre. (The C++ Programming language notamment). J’ai l’impression que le C est beaucoup plus simple. Après je n’ai jamais lu de livre sur la partie moderne du C++ mais pas mal de développeurs de jeux vidéos (vétérans) critiques le C++ et donc on est en droit de se poser la question est-ce que cela vaut le coup… Notamment la partie POO qui est pas mal dénigrée sauf pour les GUI. (David Joiner https://medium.com/machine-words/the-rise-and-fall-of-object-oriented-programming-d67078f970e2, Mike Acton https://www.youtube.com/watch?v=rX0ItVEVjHc idem pour Jonathan Blow qui de ce fait crée son propre langage Jay) Je ne voudrais pas que Le guide du C++ moderne se retrouve dans les étagères avec les autres livres sur le C++. Votre avis ?

Comme tu l’as vu, la vidéo de Mike Acton est à la CppCon. L’idée est bien que le "problème" n’est pas le C++ en soi, mais certaines approches de la POO. Et ce n’est pas grave, puisque le C++ est multi paradigme et peut faire du data oriented sans problème.

Après, il faut bien être conscient que les "vieux" (je suis vieux aussi, donc j’ai le droit !) ont leur habitudes et ont du mal avec les nouveautés. Certaines critiques des devs de JV envers le C++ sont pas du tout justifiée. On voit aussi ce genre de critiques avec l’embarquée et les devs C. Donc il faut prendre du recul avec ces critiques.

D’autant plus que je ne suis pas sur que ces critiques soient réellement représentatif de l’ensemble du JV. On les voit pas mal chez les dev de JV indépendant, qui bossent sur des jeux from scratch, seul ou en petite équipe. Mais sur l’ensemble de la production de JV, je ne sais pas ce que cela représente. Beaucoup de JV sont fait avec des langages plus haut niveau (donc moins performants - mais les perfs sont suffisantes), avec des moteurs de jeux (qui sont de gros produits industriels, donc avec des contraintes fortes en termes de maintenabilité), etc.

De plus, il faut ajouter que le C++ bosse pas mal pour faire évoluer dans le bon sens (même si ce n’est pas simple…). Il y a des groupes de travail pour les performances, les JV, les graphismes, etc. dans le comité C++.

Au final, apprendre le C++ ne sera pas un plus mauvais choix que le C, même pour bosser dans le JV. Et la POO reste très utilisé dans les domaines où elle a un intérêt, meme dans le JV (pour faire un menu par exemple, on s’en tape des perfs. La POO ne posera aucun problème pour faire ca).

En termes d’apprentissage, je pense aussi que c’est une bonne chose d’apprendre la POO. Parce que, à mon sens, cela reste des connaissances utiles, en particulier les bénéfices et limites de la POO. Si tu n’apprend pas la POO, alors tu utiliseras les autres approches pas parce que c’est un meilleur choix technique, mais par incompétence sur la POO. Pas sur que ce soit une bonne chose.

+2 -0

Bonjour Kamelitoloveless,

Si j’ai bien compris, tu parles du livre qui est tiré de ce cours ? Comme te l’as dit l’un des deux auteurs, c’est la même chose (sauf que la partie POO est réécrite). Donc pour moi, et sauf erreur, c’est kif-kif-bourricot !

L’avantage du livre papier, c’est qu’il ne changera jamais, et il sera toujours disponible.

En tout cas, si tu as besoin d’aide, il y aura toujours quelqu’un ici ! (il y a un forum sur les langages info)

Cordialement

Merci de ce retour mieux vaut il commencer par ce cours ou par le livre ?

kamelitoloveless

Excuse-moi, je n’ai pas vu ton message. Eh bien pour le début effectivement c’est pareil. Mais la partie POO est bien plus complète sur le livre, donc c’est cette partie qui va faire une grosse différence. :)

informaticienzero

Merci de ce retour mieux vaut il commencer par ce cours ou par le livre ?

kamelitoloveless

Excuse-moi, je n’ai pas vu ton message. Eh bien pour le début effectivement c’est pareil. Mais la partie POO est bien plus complète sur le livre, donc c’est cette partie qui va faire une grosse différence. :)

informaticienzero

Dans le cours il est écrit : "Un peu plus bas, la liste déroulante commençant par C++ permet de choisir la version du langage. Dans ce tutoriel, nous utiliserons la version «C++17», qui correspond à la version 2017 du langage. Que vous choisissiez «C++17» ou «C++17 (GNU)», cela n’a aucune importance à notre niveau. "

Dans la description du livre sur amazon : "…ce livre vous dotera de bases solides pour que vous puissiez ensuite poursuivre seul votre apprentissage. Il se fonde sur les normes C++17 et C++20. "

Si je lis bien, le livre se fonde aussi sur le C++20 ce qui me parait somme toute logique, mais pas le cours c’est ca ?

Si je lis bien, le livre se fonde aussi sur le C++20 ce qui me parait somme toute logique, mais pas le cours c’est ca ?

kamelitoloveless

À l’époque où le tutoriel a été publié la première fois sur Zeste de Savoir, la norme la plus récente était C++17. Quand le cours a été adapté en livre, C++20 était déjà sorti et son support par les différents compilateurs permettait déjà d’en parler dans le livre.

Donc le livre inclut effectivement plusieurs passage C++20 qui ne sont pas présents sur la version Zeste de Savoir. :)

Si je lis bien, le livre se fonde aussi sur le C++20 ce qui me parait somme toute logique, mais pas le cours c’est ca ?

kamelitoloveless

À l’époque où le tutoriel a été publié la première fois sur Zeste de Savoir, la norme la plus récente était C++17. Quand le cours a été adapté en livre, C++20 était déjà sorti et son support par les différents compilateurs permettait déjà d’en parler dans le livre.

Donc le livre inclut effectivement plusieurs passage C++20 qui ne sont pas présents sur la version Zeste de Savoir. :)

informaticienzero

Le cours va t’il être mis à jour avec les nouveautés de C++20 ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte