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

Merci beaucoup pour ces informations si rapides !

Pour un débutant complet, je conseillerais peut-être d’attendre les versions publiées, sachant qu’on publie assez régulièrement des nouveaux chapitres.

D’accord, je vais donc chercher un tuto à mettre sous la dent en attendant la publication.

A bientôt j’espère !

Merci mais je pense que je vais attendre la suite du cours pour ce qui est du C++, je vais lire celui-ci en attendant (des avis dessus ?).

Je me demandais aussi si une bibliothèque graphique va être abordée dans la suite ? Si non, connaissez-vous un bon cours à me conseiller là-dessus ?

Merci !

+0 -0

VRAIMENT Merci à vous pour ce tuto. J’avais déjà un background en C++ (juste un peu plus qu’un débutant inh , as grande chose quoi)et depuis 6 mois je me mettais à jour en ce qui concerne la version C++11 (version minimale qu’on devrait utiliser). Mais je trouvais peu de documents sur le thème(C++11, C++14) qui puisse montrer les modifications par rapport au C++98 pour un jeune débutant. La plupart évoquait des notions que j’utilisait à peine. J’ai du fouillé assez avant de pourvoir utiliser aisément les pointeurs intelligents. Aujourd’hui que je suis tombé sur ce site , franchement j’étais content. En fait j’tais à la recherche d’un bon tuto sur les Lambdas functions(ce que j’ai trouvé ici bien détaillé par les auteurs). Ce tuto devrait etre celui qu’on va recommander aux débutants pour qu’il commence directement avec la norme C++11. J’ai surtout apprécié l’état à jour du tuto qui suit les normes récentes du langage. Je me suis alors inscrit sur le site (alors qu’au départ je cherchais juste un cours sur les Lambdas). J’ai vraiment aimé , le cours est à jour , simpliste reprend les notions de bases du langages mais en C++11, C++14. Trop balèze. Félicitation à vous. J’espère pouvoir vous aider (mm si je suis encore en train de me former pour quelqu’un en génie énergétique)…

+4 -0

Merci beaucoup, tes encouragements me font très plaisir ! :)

J’espère pouvoir vous aider

Bien sûr, tu peux nous aider même si tu es débutant, notamment par des retours et des questions. Ça permet de voir ce qui est plus ou moins clair pour les lecteurs. Les lecteurs sont un important vecteur d’amélioration du cours !

+0 -0

Ok cool. N’est ce pas le chapitre sur les fichiers ?? Vraiment intéressant pour la sauvegarde des données !!

+0 -0

Ok cool. N’est ce pas le chapitre sur les fichiers ?? Vraiment intéressant pour la sauvegarde des données !!

TawalMc

Alors pas tout à fait : pour sauvegarder des données, on apprend déjà à le faire dans le chapitre Des flux dans tous les sens. Ici, on apprend à découper le code en fichiers pour organiser le code.

+0 -0

Merci beaucoup pour ce cours juste parfait, à jour et très clair…

J’ai commencé le cours il y a une semaine en « débutant » (j’avais quelques bases jusqu’aux fonctions) et déjà plus rien a me mettre sous la dent. Hâte du prochain chapitre.

+0 -0

Merci beaucoup pour ce cours juste parfait, à jour et très clair…

J’ai commencé le cours il y a une semaine en « débutant » (j’avais quelques bases jusqu’aux fonctions) et déjà plus rien a me mettre sous la dent. Hâte du prochain chapitre.

Qu3nt1

Merci pour le compliment, ça fait plaisir et motive à écrire la suite. :)

En parlant de suite, tu peux justement la lire déjà en bêta. Tu as toute la partie III terminée (et qui devrait bientôt passer en ligne).

Je rebondis sur la partie cmake.

Vous trouvez ça pertinent de mettre des chemin Windows en dur dans les fichiers cmake ?

# Configuration pour Windows avec Visual Studio.
if (MSVC)
    set (BOOST_ROOT "C:/Programmation/Boost.1.69/boost")
    set (BOOST_INCLUDEDIR "C:/Programmation/Boost.1.69")
    # Avec Visual Studio, seuls log et log_setup sont requis.
    find_package (Boost COMPONENTS log log_setup REQUIRED)
endif (MSVC)

Ça ne serait pas plus judicieux de faire créer à l’utilisateur des variables d’environnement afin de mettre tout le monde d’accord ?

Eh bien, disons que c’est une problématique à laquelle je fais face puisque je suis amené à structurer des projets en C++ en ce moment.

Pour la SFML sous Windows, j’ai configuré une variable d’environnement SFML_DIR où se trouve un fichier de configuration cmake qui fait le café : https://en.sfml-dev.org/forums/index.php?topic=24070.0

C’est peut-être plus souple, mais je n’ai pas regardé ça en détail.

Hello, une autre remarque en ce qui concerne le chapitre sur les tableaux.

Justement, comment récupère-t-on la taille de notre tableau ? En utilisant la fonction std::size, qui renvoie le nombre d’éléments de n’importe quel conteneur.

Dans le code d’exemple ci-dessous :

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> const tableau_de_int { 1, 2, 3 };

    auto const taille { std::size(tableau_de_int) };
    std::cout << "Mon tableau contient " << taille << " éléments." << std::endl;

    return 0;
}

Ne serait-il pas judicieux de préciser que la fonction std::size est définie dans l’en-tête <iterator> et de faire inclure cet en-tête dans le code d’exemple ?

Car si le code fonctionne en l’état, c’est parce qu’on devine que les en-têtes déjà présents (au hasard, <vector>) incluent l’en-tête qui définit std::size.

Sauf que la documentation de référence est explicite à ce propos.

Salut, merci de ton retour !

Ne serait-il pas judicieux de préciser que la fonction std::size est définie dans l’en-tête <iterator> et de faire inclure cet en-tête dans le code d’exemple ?

Le dire pourquoi pas, le faire inclure dans le code d’exemple, par contre, ne me paraît pas judicieux. En effet, dans un code réel, on ne l’incluerait pas justement en raison de la garantie que std::size sera disponible si on inclut <vector>. En dire un mot, par contre, ne mange effectivement pas de pain.

+0 -0

Salut mehdidou99,

Merci pour ton retour et navré pour le délai de réaction.

dans un code réel, on ne l’incluerait pas justement en raison de la garantie que std::size sera disponible si on inclut <vector>

En fait j’ignorais que le fait d’inclure <vector> garantissait de définir std::size. Auquel cas, je te fais mon mea culpa. ^^

Je vous refais signe si je chope des détails intéressants sur votre tutoriel.

Salut mehdidou99,

Merci pour ton retour et navré pour le délai de réaction.

Pas de souci !

En fait j’ignorais que le fait d’inclure <vector> garantissait de définir std::size. Auquel cas, je te fais mon mea culpa. ^^

Moi-même je n’avais jamais fait attention, c’est en lisant la doc pour te répondre que je l’ai découvert ! :)

Je vous refais signe si je chope des détails intéressants sur votre tutoriel.

Ge0

Super, merci beaucoup !

+0 -0

Bonjour, il y a deux parties en cours de rédaction actuellement, une étude de cas et la partie sur la POO. On ne sait pas encore quand est-ce qu’elles seront prêtes à la publication, mais tu peux y accéder sur la beta si tu le souhaites !

EDIT : Grillé mais je post quand-même pour le lien vers la beta.

+0 -0

Bonjour,

Je début l’apprentissage du "C++ Moderne" (enfin, comme il disent … c’est un long tourment, d’ailleurs!) et je reprends une nouvelle fois votre cours. j’ai une question sur cette page, et je me permets de vous demander de l’aide. https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/le-debut-du-voyage/deployons-la-toute-puissance-des-conteneurs/#const-et-les-it%C3%A9rateurs

Dans cette page, il y a le schéma suivant: Image utilisateur.

Si j’ai bien compris (je touche du bois), l’itérateur "end" ne pointe pas sur le dernier élément de la collection, mais juste après. Donc sur le schéma, il ne devrait pas être où il est, mais sur la case qui suit. Ma question c’est "rbegin": il pointe sur un élément (le dernier de la collection) ou juste après, comme "end" ? de même, "rend" il pointe comme "begin" sur le premier élément, ou juste avant ? Parce que, si "rbegin" ne pointe pas sur un élément, et "rend" ne pointe pas avant le premier élément, les "algorithmes" ne fonctionne pas.

Heu! J’ai tout faux ? J’ai encore rien compris ?

Merci pour la réponse.

Bien cordialement

+2 -0
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