Présentation
Le C++ fascine par l'infini des réalisations et des manières de programmer qu'il permet. D'une part, il hérite du langage C qui lui procure une base pour tout ce qui concerne l'écriture algorithmique , et d'autre part il est doté de puissants outils de structuration orientés objet .
Ce support s'adresse aux personnes qui débutent en programmation avec le langage C++ ou ayant déjà programmé dans d'autres langages. Il tient compte des dernières évolutions de C++ et éclaircit la complexité du langage par une exploration systématique de ses composantes natives (algorithmique fondamentale, programmation objet, généricité) auxquelles sont ajoutés quelques éléments sélectionnés parmi les bibliothèques standards (smart pointers ou pointeurs intelligents, conteneurs et contrôle d'erreur avec les exceptions).
La progression pédagogique de l’auteur se déroule en quatre temps.
L’auteur commence par traiter de notions qui concernent l'écriture algorithmique et ses fondamentaux : variables, opérations, structures de contrôle (if, switch, boucles, fonctions, attributs).
Dans un second temps, le lecteur bascule vers la programmation objet avec les structures et les classes puis il se concentre sur la généricité , les bibliothèques personnelles , les modules et les espaces de noms . Ensuite, l'étude des pointeurs , introduite avec les tableaux et les chaînes de caractères , est développée d'abord avec les pointeurs classiques puis avec les pointeurs-objets dits smart pointers . La quatrième et dernière étape vient compléter l'arsenal des outils natifs de la programmation objet avec les concepts d'héritage , de polymorphisme , de virtualité , de classes abstraites et d'interfaces . Pour finir, le livre s’achève sur la gestion des erreurs .
Tout au long du support, l'auteur fournit des exemples de programmes apportant la mise en pratique nécessaire pour s'approprier le langage. Tous les programmes sont en téléchargement sur le site www.editions-eni.fr.
Table des matières
Introduction
L'univers C++
Cartographie pédagogique de la grammaire C++
Organisation du livre
Public visé
Clés pour apprendre
Documentations, versions, environnements
Premiers programmes
C inclus en C++
Premiers programmes
1. La fonction main() : entrée du programme
2. "Hello world !" en C
3. "Hello world !"en C++
Bibliothèques, espaces de noms, instruction using
1. Bibliothèque <iostream>, directive #include</iostream>
2. Espace de noms et instruction using
3. L’espace de noms standard std
4. Inclusion de bibliothèques C en C++
Activer C++20
Variables simples
Introduction
Hérité du C
1. Différents types de variables
2. Déclaration des variables
3. Affecter et afficher une valeur
4. Opérateur sizeof
5. Préfixes 0b, 0x, 0 et séparateur(’)
6. Suffixes L, LL et f
7. Caractères, codage ASCII
8. Renommer des types avec typedef
Apports du C++
1. Initialisations des variables
2. Type auto
3. Opérateur decltype
4. Opérateur typeid, bibliothèque <typeinfo></typeinfo>
Constantes
Constantes const et constexpr
1. Hérité du C
2. Apports du C++
a. Plus de rigueur sur const
b. Valeurs constantes définies à lacompilation : mot-clé constexpr
Énumérations : créations de types enum
1. Hérité du C
2. Apports C++
Directive macroprocesseur #define
Affichage et saisie console
Hérité du C
1. Affichage : fonction printf
a. Chaînes de caractères
b. Convertir des valeurs en caractères avecdes formats
c. Paramétrer l’affichage de printf
2. Formatage : fonctions sprintf, snprintf,sprintf_s, snprintf_s
3. Saisie de valeurs : fonctions scanf, scanf_s
Apports C++
1. Utiliser cout et cin
a. Écrire dans la console avec cout
b. Entrer des valeurs avec cin
c. Contrôle d’erreur simple
2. Instructions de formatage en sortie
a. Afficher des valeurs booléennes
b. Largeur minimum de l’affichage
c. Alignement des sorties
d. Choisir un caractère de remplissage
e. Afficher ou non les zéros aprèsla virgule
f. Afficher le signe des nombres positifs
Opérations
Hérité du C
1. Notion d’expression
2. Opérations arithmétiques
3. Valeurs aléatoires
a. Avoir des suites différentes
b. Définir une fourchette
4. Opérations bit à bit
a. ET : opérateur &
b. OU exclusif : opérateur ^
c. OU inclusif : opérateur |
d. Complément : opérateur ~
e. Décalages gauche et droite : opérateurs>> et <<
f. Priorités des opérateurs bit à bit
Apports C++
1. Surcharger les opérateurs
2. La bibliothèque <random></random>
Conversions de types
Hérité du C
1. Le principe
2. Opérateur de conversion
3. Exemple : nombre aléatoire avec décimales
Apports du C++
1. static_cast<type></type>
2. const_cast<type></type>
3. reinterpret_cast<type></type>
4. dynamic_cast<type></type>
Structures de contrôle
Hérité du C
1. Bloc d’instructions
2. L’instruction conditionnelle if
3. Définir une condition
a. Opérateurs de comparaisons
b. L’opérateur unaire NON : !
4. Le couple d’instructions if-else
5. La forme contractée du if-else, opérateurconditionnel "?"
6. La cascade d’instructions if - else if - else
7. Les tests multiconditions (ET/OU)
a. Conjonction ET : opérateur &&
b. ET avec plus de deux expressions membres
c. Disjonction OU, opérateur ||
d. OU avec plus de deux expressions membres
e. ET prioritaire sur OU
8. Branchement : switch
9. Rupture de séquence : goto avec étiquette
10. Les trois boucles : while, do-while et for
a. Boucle TANT QUE : le while
b. Boucle FAIRE {...} TANT QUE : ledo-while
c. Boucle comptée POUR : le for
d. Boucles imbriquées
11. Sortie et saut forcés dans une boucle
a. Sortir avec l’instruction break
b. Passer à l’itération suivante avecl’instruction continue
c. Sortir d’une ou de plusieurs boucles imbriquéesavec l’instruction goto
Apports du C++
1. Condition if ou else-if marquée constexpr
2. Boucle for (:) "pour chaque"
Fonctions
Hérité du C
1. Principe
2. Fonction sans retour et sans paramètre
3. Déclaration et visibilité d’unefonction
4. Fonctions avec paramètres
a. Copie de valeurs et passage par valeur
b. Déplacer le curseur en écriturede la fenêtre console
c. Changer la couleur des caractères
d. À propos de la couleur en console
e. Afficher une lettre à une position et d’unecouleur donnée dans la console
f. Tracer une ligne horizontale
g. Le programme complet
5. Fonctions avec retour
a. Retourner un nombre aléatoire entre 0 et1
b. Retourner le résultat d’un jeté dedeux dés à six faces
c. Programme complet
d. Types des valeurs de retour
6. Fonctions avec retour et avec paramètres
a. Conversion en chiffres romains
7. Fonction et qualificatif static
a. Qualificatif static et fonctions
8. Fonctions récursives
9. Nommer les fonctions
a. Contraintes syntaxiques
b. Sens des noms choisis
c. Normes et styles pour la mise en forme du code source
Apports du C++
1. Fonctions embarquées "inline"
2. Fonctions constantes marquées constexpr
3. Fonctions marquées const
4. Fonctions déclarées noexcept
5. Valeurs par défaut de paramètres
6. Surcharge des fonctions
7. Références et passage par référence
8. Expression lambda (fonction anonyme)
a. Principe
b. Syntaxe générale
c. Les clauses de capture
d. Clauses de capture multiples
e. Spécification mutable
f. Listes de paramètres
g. Spécification d’une exception
h. Le type de retour
i. Lambda constexpr
j. Récupérer une lambda et appels possibles
k. Quelques précisions
9. Fonction operator et surcharge des opérateurs
10. Fonctions génériques (template,auto)
Précisions sur les variables, attributs
Précisions sur les variables
1. Visibilité et durée de vie d’unevariable
2. Masquage d’une variable
3. Variable static
Attributs
1. Principe et syntaxe
2. Exemples d’utilisation
a. Expérimentation GNU
b. Expérimentation GSL Microsoft
3. Attributs standards
a. [[noreturn]] (depuisC++11)
b. [[fallthrough]] (depuisC++17)
c. [[deprecated]], [[deprecated("reason")]] (depuisC++14)
d. [[nodiscard]] (depuisC++17) [[nodiscard("reason")]] (depuisC++20)
e. [[maybe_unused]] (depuisC++17)
f. [[likely]] et [[unlikely]] (depuisC++20)
g. [[no_unique_address]] (depuisC++20)
Structures et classes
Hérité du C
1. Principe de la structure
2. Disposer d’une structure
a. Définir un type de structure
b. Déclarer une variable structure
c. Initialiser à la déclaration
d. Accéder aux éléments avecl’opérateur point
e. Copier deux structures
3. Structures et fonctions
a. Fonction d’initialisation d’une entité
b. Fonctions d’affichage et d’effacement
c. Fonction pour avancer
d. Boucle événementielle
e. Contrôle du rythme de l’animation
f. Rendre invisible le curseur en écriture
g. Démo entité mobile
4. Structures imbriquées
Apports du C++ : la structure devient une classe
Classes
De la structure à la classe
1. Des droits d’accès : public,protected, private
2. Des fonctions membres
a. Cas général
b. Fonctions membres déclarées const
3. Une initialisation renforcée
a. Initialisations à la déclaration
b. Initialisations par défaut dans la classe
4. Des constructeurs et des initialiseurs
a. Initialiser avec des constructeurs
b. Constructeur par défaut
c. Initialisations contraintes par les constructeursexistants
d. Constructeurs avec initialiseurs
e. L’initialiseur initialise les constantes
5. Le pointeur this
6. Un programme C muté objet C++
a. Réécriture des entitésmobiles
b. Amélioration du programme
7. Que dire des structures en C++ ?
a. Des aspects pratiques
b. Réfléchir l’interface des objets
Accesseurs (property en anglais)
1. Lire une variable private ou protected
2. Modifier une variable private ou protected
3. Intérêt d’un appel de fonction
Qualificatif static dans une classe
default et delete pour les fonctions spéciales de classe
1. Fonctions spéciales
2. Utiliser default (rappel et précision)
3. Utiliser delete
Surcharge des opérateurs
1. Principe
2. Fonction operator hors classe
a. Exemple addition : operator+
b. Exemple décalage à gauche :operator<<
3. Fonction operator dans une classe
a. operator+ sans retour
b. operator+ avec retour de l’objet courant(*this)
c. opérator+ avec retour d’un nouvelobjet résultant
4. Transformer un objet en une fonction (objet fonctionou fonction objet)
5. Utiliser l’opérateur bool
L’instruction friend ("ami")
Unions, unions illimitées
Principe
Union de structures
Union discriminée
Union illimitée (C++11)
Généricité, template, auto
Principe du template
Template de fonction
1. Définir une fonction générique
2. Fonction avec plusieurs types génériques
3. Évaluation des types génériques à lacompilation
4. Expressions lambda et template
5. Template pour passer des valeurs
Template de classe
1. Syntaxe
a. Syntaxe générale
b. Syntaxe des constructeurs
c. Syntaxe avec plusieurs types génériques
d. Déduction de type à l’initialisation
e. Types par défaut
f. L’instance du template influence le type de la classe
2. Paramétrages
a. Paramétrage avec des valeurs
b. Template en paramètre de template
c. Spécialiser une fonction pour un type donné
d. Spécialiser une classe complète
e. Spécialiser une classe avec plusieurs typesgénériques
f. Paramétrage avec des objets fonctions
Template variadique et paquet de paramètres
1. Principe : l’opérateur variadique(…)
2. Template variadique de fonction
a. Cas général
b. Itérations simplifiées (fold expression,C++17)
c. Deux paramètres variadiques
3. Template variadique de classe
Utilités standards à base de templates
1. La classe bitset
2. La classe tuple<…>
3. La classe pair<>
4. Alternatives à l’union
a. La classe variant
b. La classe optional
c. La classe any
5. La classe std::function<>
Concepts (C++20)
1. Définir un concept
2. L’expression requires
a. Exemple d’utilisation sans paramètre
b. Exemple d’utilisation avec paramètres
3. Établir des contraintes
a. Conjonction ET (&&)
b. Disjonction OU (||)
Spécification auto
1. Principes généraux
a. Variables simples auto
b. Listes auto
2. Templates et auto
a. Spécification decltype(auto)
b. Comparaison entre auto et template
c. Utilisation de auto dans un template
Bibliothèques, modules et espaces de noms
Créer une bibliothèque classique (.h)
1. Contenu du fichier outils.h
2. Contenu du fichier outils.cpp
3. Contenu du fichier main.cpp
4. Problèmes de redéfinitions, instructionextern
Espaces de noms (namespace)
1. Cartographier du code
2. Accéder au contenu
3. Répartition sur plusieurs fichiers
a. Espace de noms dans une bibliothèque
b. Espace de noms réparti entre plusieurs fichiers
c. Espace de noms ToutpourlesChiens réorganisé
4. Imbriquer des espaces de noms
5. Espaces de noms inline
6. Espace de noms anonymes
7. Remplacer un nom trop long par un alias
La directive using
1. Faciliter l’accès à un espace denoms
2. Constituer un alias de type
Modules (C++20)
1. Principe
2. Créer une unité d’interface de module(.ixx)
3. Définir le contenu du module
4. Importer le module dans un fichier source
5. Utiliser des bibliothèques standards dansun module
6. Utiliser une bibliothèque personnelle dansun module
7. Éléments non exportables dans unmodule
8. Partitionner un module
9. Espaces de noms dans un module
10. Créer un fichier d’implémentationde module
11. Création d’un module Outils (version 1)
12. Création d’un module Outils (version 2)
13. Modules ou bibliothèques ?
Précision sur la liaison entre C++ et C
Tableaux statiques, introduction conteneurs
Hérité du C
1. Principe du tableau
2. Disposer d’un tableau
a. Définir et déclarer un tableau
b. Des constantes pour les tailles
c. Accéder aux éléments dutableau avec l’opérateur [ ]
d. Débordement de tableau
e. Parcourir un tableau avec une boucle for
f. Initialiser un tableau à la déclaration
3. Tableaux à plusieurs dimensions
a. Matrice à deux dimensions
b. Tableaux à n dimensions
c. Initialiser à la déclaration
d. Parcourir un tableau à plusieurs dimensions
4. Tableaux en paramètre de fonctions
Apports du C++
1. Boucle for (:) "pour chaque"
2. Récupérer une liste variadique d’élémentsdans un tableau statique
3. Tableaux d’objets, exemple fourmilière (version1)
4. Tableau dans une classe, fourmilière (version2)
a. Paramétrer la classe
b. La classe fourmilière
5. Tableau dans une classe, exemple pile générique
a. Création de la pile
b. Tri paramétrable de la pile (objet fonction)
c. Spécialisation sur un type
Introduction des conteneurs
1. La classe array
2. La classe vector
3. La classe list
4. Contenus variadiques
5. Boucle for_each de la bibliothèque<algorithm></algorithm>
Chaînes de caractères, la classe string
Hérité du C
Apports du C++ : la classe string
Pointeurs
Principes généraux
1. Adresse et mémoire
2. Une variable pointeur
3. Quatre opérateurs dédiés
4. Cinq utilisations classiques
Hérité du C
1. Déclarer un pointeur dans un programme
2. Opérateur adresse : &
3. Opérateur étoile : *
4. Opérateur flèche : ->
5. Opérateur crochets : [ ]
6. Priorité des quatre opérateurs
7. Pointeurs et constantes
a. Pointeur variable sur un objet constant
b. Pointeur constant sur un objet variable
c. Pointeur constant sur un objet constant
8. Le pointeur générique void*
9. Pointeurs de fonction
a. Une fonction est une adresse
b. Reconnaître le type d’une fonction
c. Appeler une fonction via un pointeur du bon type
d. Cast nécessaire si le pointeur est un void*
e. Pourquoi des pointeurs de fonction ? Les « callbacks »
Apports du C++
1. Un souci de rigueur
a. Plus de rigueur
2. Opérateurs new et delete, new[ ] etdelete[ ]
a. Principe
b. Respecter les couples new-delete et new[]-delete[]
c. Allocation d’un tableau de 0 élément ?!
d. Précisions sur l’opérateur new
3. La valeur nullptr
4. Type référence & (pointeur constantet simplifié)
a. Principe
b. Une référence est constante
c. Référence déclaréeconst
d. Connaître la valeur de la référence
5. Retourner une référence
a. Piège à éviter
b. Masquer un tableau avec une fonction
6. Type référence && (Rightvalue)
a. Des catégories d’expressions
b. lvalues (objets persistants) et rvalues (objets temporaires)
c. Affectations d’objets temporaires rvalues
d. Objets rvalues passés en paramètrede fonction
e. Remarque : une ambigüité possible
f. Déclarateur de référencervalue : &&
g. Référence rvalue && en paramètrede fonction
h. Référence rvalue && en paramètrede constructeur
7. Conversions en rvalue
a. Un static_cast<>
b. La fonction de déplacement std::move
c. La fonction de transfert std::forward<>
d. Situation de conversion implicite de rvalue(&&) à lvalue(&)
e. Liste variadique et transfert parfait
8. Spécificateur decltype et références
Pointeurs et références dans la classe
Introduction
Le destructeur
1. Les éléments non dynamiques s’autodétruisent(rappel)
2. Problème des éléments dynamiquesperdus en mémoire
3. Écrire un destructeur des élémentsdynamiques
4. Appels explicites du destructeur
5. Destructeur appelé avec delete
Constructeur de copie
1. Principe
2. Copier un objet à la déclaration
3. Copier des objets possédant des donnéesdynamiques
a. Problème des données dynamiques
b. Interdire la copie
c. Implémenter un constructeur de copie
Constructeur de déplacement
1. Principe
2. Possible avertissement noexcept
3. Constructeur de déplacement avec donnéesdynamiques
Surcharge des opérateurs et données dynamiques
1. Affectation de copie (operator=)
2. Affectation de déplacement (move)
3. Surcharge operator+
Questions diverses
1. Spécialiser une classe génériqueen pointeur
2. Créer un singleton
3. Références dans une classe
Pointeurs-objets ou "smart pointers"
Introduction
1. La bibliothèque memory
2. Transformer un pointeur en objet
La classe std::unique_ptr
1. Expérimentation du pointeur unique
2. Survol du contenu principal
a. Constructeurs
b. Destructeur
c. Six surcharges d’opérateurs
d. Cinq fonctions membres
e. Quatre fonctions hors classe
La classe std::shared_ptr
1. Expérimentation du pointeur partagé
2. Survol du contenu principal
a. Constructeurs
b. Destructeur
c. Six surcharges d’opérateurs
d. Cinq fonctions membres
e. Fonctions hors classe
f. Fonctions hors classe de conversion
La classe std::weak_ptr
1. Expérimentation du pointeur "simple observateur"
2. Survol du contenu principal
a. Constructeurs
b. Destructeur
c. Six fonctions membres
d. Surcharge opérateur =
Allocateur de mémoire : la classe std::allocator
Pointeurs, utilisations classiques
Introduction
Pointeur en paramètre (passage par référence)
1. Expérimentation avec pointeur classique
2. Simplification de l’écriture avec des référencesC++
3. Tableau en paramètre
a. Tableau à une dimension
b. Tableaux à plusieurs dimensions
Allocation dynamique et tableaux
1. Tableau de pointeurs
2. Allocation d’un tableau à une dimension
3. Allocation d’un tableau à plusieurs dimensions
a. Allocation d’une matrice de int
b. Allocation d’une forme à six dimensions depoints
4. Quelques pièges classiques de l’allocationdynamique
Relier des objets
1. Associer deux types structures style C
a. Structures Avion et Pilote
b. Avion ou pilote existent-ils ?
c. Avion ou pilote sont-ils libres ?
d. Relier avion et pilote
e. Délier un avion et un pilote
f. Constructeurs Avion et Pilote
g. Afficher Avion et Pilote
h. Détruire un Avion ou un Pilote
i. Code complet, main action
2. Associer des classes de même type
3. Élaborer une liste, fourmilière(version 3)
Associations entre classes
Introduction
Principes des associations pour les relations entre objets
1. Association simple
2. Agrégation
3. Composition
4. Problème syntaxique en C++
Associations simples : messages entre objets
1. Liaison non réciproque entre deux objets
2. Liaison réciproque entre deux objets
Agrégations : coopération entre objets
1. Liaison à sens unique (exemple guitare, guitariste)
2. Partage d’objets pointés (plusieurs musiciens,une guitare)
a. Musiciens simultanés
b. Plusieurs musiciens successifs
Liaisons réciproques entre objets
1. Problème de syntaxe
2. Déclaration de type incomplet
3. Limite du type incomplet
4. Résolution du problème
5. Exemple Terminator
Composition : dépendance entre objets
1. Choisir entre agrégation ou composition
2. Techniques envisageables
3. Pointeur d’objet en propriété
4. Objet en propriété
5. Référence d’objet en propriété
Héritage
Principe
Définir une classe dérivée
Appeler explicitement un constructeur de la classe de base
Redéfinition de données ou de fonctions
Spécifier un membre de la classe de base
Droits d'accès locaux de la classe héritée
Droits d'accès globaux de la classe héritée
Héritage multiple
1. Principe et syntaxe
2. Exemple : InDominusRex
3. Relations transversales dans un arbre de classes
4. Héritage multiple avec une base virtuelle
Comment identifier un héritage
1. Distinction entre héritage et association
2. Distinction entre attributs et nouvelle classe
Polymorphisme et virtualité
Principe
Accès pointeurs limité par son type
Autorisation d'accès pour les fonctions virtuelles
Destructeur virtuel
Intérêt des fonctions virtuelles
Classe abstraite et interface
Classe abstraite, fonctions virtuelles pures
Tronc commun pour dériver
Interface
Récupérer une sous classe depuis une base abstraite
Résumé classe abstraite et interface
Expérimentation : exemples des super-héros, les Avengers
1. Classe de base super-héros, interface desfonctions d’action
a. Définition et stockage des armes
b. Définition et stockage du paramétrage émotionnel
c. Interface de fonctions pour tous les super-héros
d. Définition de la classe "SuperHeros"
2. Une dérivée pour chaque Avenger
a. Classe "CaptainAmerica"
b. Classes Hulk, IronMan, BlackWidow et Thor
3. Souhait du polymorphisme et impossibilité
4. Virtualité, intérêt del’interface des fonctions d’action
5. Classe abstraite
Gestion des erreurs
Introduction
Socle hérité du C
1. Retourner un booléen
2. Retourner un numéro d’erreur
3. Afficher des informations au moment de l’erreur
4. Bibliothèques C de contrôle d’erreur
a. La bibliothèque <cerrno> (errno.h)</cerrno>
b. La bibliothèque <cassert> (assert.h)</cassert>
Contrôle d'erreur C++
1. Introduction
a. Bibliothèques de diagnostics
b. Conseil sur les exceptions
2. Instructions natives throw, try et catch
a. Retour throw
b. Saut try et récupération catch
c. Retour throw d’un appel de fonction
d. Instruction throw sans valeur de retour
e. Bloc catch(...) par défaut
f. Exception non gérée
g. Fonctions déclarées noexcept
3. L’en-tête <exception></exception>
a. Principe
b. Classe std::exception
c. Les fonctions std::terminate, std::set_terminate,std::get_terminate
d. Utiliser la virtualité de la classe std::exception
4. Déclaration static_assert
Auteur
Frédéric DROUILLON Frédéric DROUILLON est enseignant, chercheur et aussi créateur dans le domaine de l'informatique et des arts numériques. Il envisage la programmation et ses langages comme un moyen d'expression et de formulation d'idées, une véritable écriture, qui fait naître de la recherche et de la créativité. L'objectif de son enseignement en langage C++ est de permettre au lecteur d'acquérir un savoir-faire fondamental en programmation informatique pour qui lui donnera très certainement envie de pouvoir circuler dans les autres techniques et langages de programmation.
En savoir plus Découvrir tous ses livres