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 ! ;)

143 commentaires

Bonjour, Tout d’abord super ce tuto, je me mets à jour après le (très) vieux cours d’OpenClassrooms, ça fait plaisir de découvrir les std::array et les auto :D

Dans le cours sur les conteneurs et itérateurs Déployons la toute puissance des conteneurs, vous utilisez tout à la fin la fonction std::distance pour l’exercice de découpage des mots (sur deux lignes différentes):

std::string mot { debut, debut + std::distance(debut, iterateur) };

Mais comme c’est utilisé avec une somme, on peut tout simplement remplacer le tout par :

std::string mot { debut, iterateur };

J’imagine que c’est pour introduire une nouvelle fonction, mais vous pourriez peut-être préciser qu’elle n’est pas nécessaire dans ce cas ?

Merci de votre retour, le cours est vraiment super !

EDIT : J’aime bien corriger les coquilles, donc quand j’en verrai une j’éditerai le message :ange: (c’est pas très pratique parce qu’il y en a plusieurs, est-ce qu’il y a une meilleure manière de le faire ?):

  • Rencontre avec le C++ : Paragraphe Les commentaires, c’est "j’ai omis de traiter d’un bout de code"
  • Une super mémoire : Il faudrait rajouter le "un" dans "Il ne doit pas commencer non plus par un underscore", puis plus loin dans "Sinon, par défaut…", il manque un tiret dans "Mais que se passe-t-il" et "Le code va-t-il", puis un peu plus loin : "les chaînes de caractères, initialiséeS avec du vide."
  • Le conditionnel conjugué : à la correction de l’exercice de parenthésage : "Voici la solution. L’avez-vous trouvéE ?"
  • Des flux dans tous les sens : à la fin du paragraphe "Vois sur ton chemin", c’est courant pas courrant. Au début du paragraphe std::ofstream, je pense que c’est "Cela nous est utilise utile", puis plus loin pour la procédure d’utilisation d’UTF-8 : "Pour se ce faire […] pour le champ". Dans le paragraphe "Les modificateurs de flux", "Vous savez que, si vous afficheZ"
+3 -0

Bon j’ai hésité un peu avant de poster ce message et désolé si quelqu’un d’autre l’a signalé bien avant. Voila dans le chapitre des flux dans tous les sens, lorsqu’on arrive a l’exercice, Statistiques dans tous les sens.

On constat que si le fichier dont on veut lire, commence par un espace, ce petit programme nous donne un résultat qui n’est pas correcte (nombre de mots augmenté de 1). J’ai essayé de trouver une solution pour remédier a ceci. Je n’y arrive pas pour l’instant. Sinon bonne soirée a vous.

Édit : trouver une solution m’aide un peu a m’entraîner et progresser si je peux dire. Et je ne voudrais pas que cette erreur se balade encore lors de la prochaine validation de ce tutoriel.

+0 -0

Salut, je suis en train de suivre le cours (plus précisément à "des flux dans tout les sens") et j’ai quelques remarques, déjà pourquoi ne pas avoir parlé de la solution très simple pour afficher des accents en console sous windows qui consiste à : Ajouter

#include <windows.h>

et

#define NOMINMAX 1

en début de code ainsi que

SetConsoleOutputCP(1252);

en début de fonction main, et qui permet d’afficher des accents. Et je me posait donc la question : est-ce que ça marche entre les fichiers (à la place de votre méthode avec "u8")?

+2 -0

Salut @valerian.roura

Pourquoi ne pas avoir parlé de la solution très simple pour afficher des accents en console sous windows qui consiste à : Ajouter

#include <windows.h>

et

#define NOMINMAX 1

en début de code ainsi que

SetConsoleOutputCP(1252);

valerian.roura

Eh bien si, on en parle justement dans le chapitre 3, sous l’encadré Un mot sur Windows. :)

Hey, c’est encore moi! J’ai une petite question : Comptez vous aborder la programmation graphique?

valerian.roura

Non, ce n’est pas prévu. Mais libre à d’autres de se lancer là-dedans. ;)

Salut, savez-vous dans combien de temps le prochain chapitre sera dispo ?

samirpro570

Je ne peux pas te donner de date puisque ça dépendra du validateur qui s’en occupera et des remarques qu’il aura pour nous.

En tout cas, tu peux déjà lire la suite sur la bêta, avec notamment les deux prochains chapitres qui sont terminés et en cours de validation.

Je vient de voir le nouveau cours sur les "handle", déjà que learn la programmation c’est quelque chose alors learn avec du vocabulaire poussé français ça complique pas mal les choses pouvez-vous utilisé un vocabulaire moins poussé un peu cool a la "Open classeroom".

du genre : // Accès à l’objet sous-jascent. En : // Accès à l’objet Caché. Me paraîtrais beaucoup plus cool a comprendre.

J’éspère que vous ne le prendrais pas mal ce retour.

+0 -3

Bonjour à Zeste de Savoir,
Merci pour ce gros gros travail de documentation sur C++ en français.
Tout ce qu’on voudrait savoir sans oser le demander…
Après quelques années de repos, voilà que je me remets à la programmation.
Je suis comme un gosse, j’utilise Qt sur Mac Os X, avec quelques tentatives sur XCode. Comment je suis arrivé sur Zeste de Savoir ?
Un pur hasard, une compilation C++ avec Qt qui ne veut pas linker une bibliothèque OpenGL (sans doute pas étonnant avec Apple qui s’est mis à Metal, pour remplacer OpenGL). Ceci afin de faire des textures réalistes de cailloux sur Blender…
Je n’y connais rien en compilation C++, je me rend compte que ça semble plutôt compliqué, alors je commence à faire des recherches et tombe sur Zeste de Savoir : Elle est où la Doc C++ ?
Alors je me suis attelé à lire du début, je fais les exercices et j’en suis aux fonctions…
J’ai aussi commencé les tutos de Qt, avec quelques péripéties de mises au point avec des problèmes d’évolutions de versions propres à Qt. Ce qui me fait dire que les informaticiens ne seront jamais au chômage.

Je suis très heureux d’apprendre que quelques survivants du Site du Zéro sont les créateurs de ce site.
Site du Zéro que j’utilisais quand je faisais un peu de Python…

+2 -0

Je vient de voir le nouveau cours sur les "handle", déjà que learn la programmation c’est quelque chose alors learn avec du vocabulaire poussé français ça complique pas mal les choses pouvez-vous utilisé un vocabulaire moins poussé un peu cool a la "Open classeroom".

du genre : // Accès à l’objet sous-jascent. En : // Accès à l’objet Caché. Me paraîtrais beaucoup plus cool a comprendre.

J’éspère que vous ne le prendrais pas mal ce retour.

samirpro570

Je ne suis pas vraiment d’accord, le cours utilise tout simplement le vocabulaire que l’on peut retrouver sur d’autres site, ce qui permet de déjà connaître ce vocabulaire et de comprendre tout de suite de quoi on parle si on le retrouve autre part. Sinon, pour moi quand on voit le cours d’Open Classroom, heureusement que ce cours là n’y ressemble pas.

bonsoir, j’imagine que cela a été dit, mais au cas où (je n’ai pas la force de regarder tous les commentaires pour vérifier).

Il y a deux erreurs dans le tuto sur les tableaux. (page 106 ou 108).

En effet, pour déterminer la taille d’un tableau, si je tape std::size(nom_du_tableau) j’obtiens une belle erreur de compilation (en tous cas, chez moi sous linux avec gcc). Il s’agit plutôt d’une fonction : nom_du_tableau.size() qui me revoit la taille du tableau.

Pareil pour savoir si un tableau est vide ou pas. Si je rentre std::empty(nom_du_tableau) ça plante; par contre, nom_du_tableau.empty() fonctionne.

En espérant que ça serve.

Michel

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