Académique Documents
Professionnel Documents
Culture Documents
Langage C++
Langage C++
tions), ensembles de variables (structures et tableaux), pointeurs... En savoir-faire fondamental en programma-
bref, il s’agit du langage C intégré au langage C++. L’auteur expose les tion informatique pour ensuite circuler le
correctifs et les élargissements fonctionnels apportés par le C++. Les plus librement possible dans les diffé-
classes et les objets commencent à apparaître avec la notion de struc- rentes techniques et langages de pro-
tures. Les améliorations apportées par le C++ sont mises en pratique dans grammation.
la réalisation de programmes au fur et à mesure de leur introduction.
Dans une deuxième partie se trouve ce qui fait la force du C++ : l’auteur
présente ainsi des outils de structuration qui permettent au lecteur de Les chapitres du livre
L’héritage du C
s’orienter franchement vers la programmation et l’architecture objet des
programmes. Il y détaille les notions de classes (constructeurs, destruc- Partie C++ hérité du C : Introduction • Pre-
miers programmes • Variables simples,
teurs), d’objets, la problématique de relations entre objets, l’héritage, la
constantes, affectation • Affichage et saisie
problématique du polymorphisme avec virtualité, les notions de classe
et la programmation
console • Opérations • Conversions de
abstraite et d’interface… L’ensemble des fonctionnalités associées à ces types • Structures de contrôle • Fonctions •
différents concepts sont étudiées. Portée et durée de vie des variables • Struc-
Pour finir, un chapitre compare le C et le C++. Certains outils comme les tures • Bibliothèques et espaces de noms •
orientée objet
Unions • Tableaux statiques • Chaînes de
pointeurs et les paramètres de fonctions peuvent en effet s’interpréter
caractères • Pointeurs • Principales utilisa-
différemment dans des situations créées par l’un ou l’autre des deux lan- tions des pointeurs • Gestion des erreurs •
gages. Ce chapitre permet ainsi au lecteur de pallier la difficulté de passer Deux automates cellulaires • Partie La di-
d’un langage à l’autre en prenant en compte ces différences d’interpréta- mension objet du C++ : Classes, objets •
tion.
Tout au long du livre, l’auteur fournit une série d’exercices diversifiés et
Surcharge des opérateurs • Classes et
membres static • Classes génériques •
Classe d’objets changeants • Associations
(avec programmes d’illustration
et exercices)
des exemples de programmes apportant la mise en pratique nécessaire
Téléchargement entre objets • Héritage • Polymorphisme et
pour s’approprier
www.editions-eni.fr
.fr le langage. Les éléments nécessaires à la réalisation des virtualité • Classe abstraite et interface •
exercices sont en téléchargement sur le site www.editions-eni.fr. Quelques comparaisons entre C et C++
ISBN : 978-2-409-01530-4
Frédéric DROUILLON
Table des matières 1
Introduction
1. Le C++ au pied de la lettre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2. Cartographie de la grammaire C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3. Organisation du livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4. Modalités de comparaison C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5. Public visé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6. Clés pour apprendre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7. Environnements de développement . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Chapitre 1
Premiers programmes
1. C inclus en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2. La fonction main() : entrée du programme. . . . . . . . . . . . . . . . . . . . . 36
3. "Hello world !" en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4. "Hello world !"en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.1 Bibliothèque <iostream>, directive #include . . . . . . . . . . . . . . 39
4.2 L'instruction using namespace std; . . . . . . . . . . . . . . . . . . . . . . . 40
4.3 Inclusion des bibliothèques C en C++. . . . . . . . . . . . . . . . . . . . 41
2 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 2
Variables simples, constantes, affectation
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2. Socle C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.1 Différents types de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.2 Déclaration des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.3 Affecter et afficher une valeur (avec cout qui est C++) . . . . . . 46
2.4 Caractères, codage ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.5 Variables constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.6 Énumérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7 Directive #define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.8 Opérateur Sizeof. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3. Apports C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.1 Déclarations plus souples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2 Type bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3 Type long long ou unsigned long long . . . . . . . . . . . . . . . . . . . . 54
3.4 Type caractère unicode : wchar_t . . . . . . . . . . . . . . . . . . . . . . . . 55
3.5 Type auto (C++ 2011) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.6 Constantes (const) et énumération (enum)
plutôt que #define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Chapitre 3
Affichage et saisie console
1. Socle C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
1.1 Fonction printf (déconseillé en C++) . . . . . . . . . . . . . . . . . . . . 59
1.2 Fonctions sprintf et snprintf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
1.3 Fonction scanf (déconseillé en C++) . . . . . . . . . . . . . . . . . . . . . 63
Table des matières 3
2. Apports C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.1 Utiliser cout et cin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.2 Instructions de formatage en sortie. . . . . . . . . . . . . . . . . . . . . . . 66
2.2.1 Largeur minimum de l'affichage . . . . . . . . . . . . . . . . . . . . 66
2.2.2 Alignement des sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
2.2.3 Choisir un caractère de remplissage . . . . . . . . . . . . . . . . . 67
2.2.4 Afficher ou non les zéros après la virgule. . . . . . . . . . . . . 68
2.2.5 Afficher le signe des nombres positifs . . . . . . . . . . . . . . . 69
Chapitre 4
Opérations
1. Socle C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.1 Notion d'expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.2 Opérations arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
1.3 Valeurs aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
1.3.1 Avoir des suites différentes . . . . . . . . . . . . . . . . . . . . . . . . 74
1.3.2 Définir une fourchette. . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
1.4 Opérations bit à bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
1.4.1 ET : opérateur & . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
1.4.2 OU exclusif : opérateur ^ . . . . . . . . . . . . . . . . . . . . . . . . 77
1.4.3 OU inclusif : opérateur |. . . . . . . . . . . . . . . . . . . . . . . . . . 77
1.4.4 Complément : opérateur ~. . . . . . . . . . . . . . . . . . . . . . . . 78
1.4.5 Décalages gauche et droite : opérateurs >> et << . . . . 78
1.4.6 Priorités des opérateurs bit à bit . . . . . . . . . . . . . . . . . . . . 78
2. Apports C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
2.1 Surcharger les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 5
Conversions de types
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
1.1 Le principe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
1.2 Opérateur de conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
1.3 Exemple : nombre aléatoire avec décimales . . . . . . . . . . . . . . . . 83
2. Apports du C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
2.1 static_cast<type> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
2.2 const_cast<type> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
2.3 reinterpret_cast<type>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
2.4 dynamic_cast<type> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Chapitre 6
Structures de contrôle
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
1.1 Bloc d'instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
1.2 L'instruction conditionnelle if . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
1.3 Définir une condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
1.3.1 Opérateurs de comparaisons. . . . . . . . . . . . . . . . . . . . . . . 92
1.3.2 L'opérateur unaire NON : ! . . . . . . . . . . . . . . . . . . . . . . . . 93
1.4 Le couple d'instructions if-else. . . . . . . . . . . . . . . . . . . . . . . . . . . 93
1.5 La forme contractée du if-else, opérateur conditionnel "?" . . . . 95
1.6 La cascade d'instructions if - else if - else . . . . . . . . . . . . . . . . . . 96
1.7 Les tests multiconditions (ET/OU). . . . . . . . . . . . . . . . . . . . . . . 97
1.7.1 Conjonction ET : opérateur &&. . . . . . . . . . . . . . . . . . . . 97
1.7.2 ET avec plus de deux expressions membres. . . . . . . . . . . 98
1.7.3 Disjonction OU, opérateur || . . . . . . . . . . . . . . . . . . . . . 99
1.7.4 OU avec plus de deux expressions membres . . . . . . . . . 100
1.7.5 ET prioritaire sur OU . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
1.8 Branchement : switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
1.9 Rupture de séquence : goto avec étiquette . . . . . . . . . . . . . . . . 104
Table des matières 5
Chapitre 7
Fonctions
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
1.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
1.2 Exemple de fonction sans retour et sans paramètre. . . . . . . . . 116
1.3 Déclaration et visibilité d'une fonction . . . . . . . . . . . . . . . . . . . 118
1.4 Exemples de fonction avec paramètres . . . . . . . . . . . . . . . . . . . 120
1.4.1 Déplacer le curseur en écriture de la fenêtre console. . . 120
1.4.2 Changer la couleur des caractères. . . . . . . . . . . . . . . . . . 121
1.4.3 À propos de la couleur en console. . . . . . . . . . . . . . . . . . 122
1.4.4 Afficher une lettre à une position
et d'une couleur donnée dans la console . . . . . . . . . . . . 123
1.4.5 Tracer une ligne horizontale . . . . . . . . . . . . . . . . . . . . . . 123
1.4.6 Le programme complet . . . . . . . . . . . . . . . . . . . . . . . . . . 124
1.5 Exemples de fonction avec retour . . . . . . . . . . . . . . . . . . . . . . . 126
1.5.1 Retourner un nombre aléatoire entre 0 et 1. . . . . . . . . . 126
1.5.2 Retourner le résultat d'un jeté de deux dés à six faces . 126
1.5.3 Programme complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
6 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 8
Portée et durée de vie des variables
1. Règles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
2. Masquage d'une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3. Variables static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Chapitre 9
Structures
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
1.1 Principe de la structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
1.2 Disposer d'une structure / entite 1 . . . . . . . . . . . . . . . . . . . . . . 146
1.2.1 Définir un type de structure . . . . . . . . . . . . . . . . . . . . . . 146
1.2.2 Déclarer une variable structure. . . . . . . . . . . . . . . . . . . . 146
1.2.3 Initialiser à la déclaration . . . . . . . . . . . . . . . . . . . . . . . . 147
1.2.4 Accéder aux éléments avec l'opérateur point. . . . . . . . . 147
1.3 Utiliser un typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
1.4 Structures en retour ou en paramètre de fonction . . . . . . . . . . 153
1.4.1 Fonction d'initialisation d'une entite . . . . . . . . . . . . . . . 153
1.4.2 Fonctions d'affichage et d'effacement . . . . . . . . . . . . . . 154
1.4.3 Fonction pour avancer. . . . . . . . . . . . . . . . . . . . . . . . . . . 154
1.4.4 Boucle événementielle . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
1.4.5 Contrôle du rythme de l'animation . . . . . . . . . . . . . . . . 156
1.4.6 Rendre invisible le curseur en écriture . . . . . . . . . . . . . . 157
Table des matières 7
Chapitre 10
Bibliothèques et espaces de noms
1. Créer une bibliothèque (.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
1.1 Contenu du fichier outils.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
1.2 Contenu du fichier outils.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . 182
1.3 Contenu du fichier main.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
2. Espaces de noms (namespace) et raccourcis (using). . . . . . . . . . . . . 187
2.1 Cartographier le code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
2.2 Accéder au contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
2.3 Répartir le code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
2.4 Limite des répartitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
2.5 Espace de noms dans une bibliothèque . . . . . . . . . . . . . . . . . . . 191
2.6 Imbriquer des espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . 193
3. La directive using . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
4. Précision sur la liaison entre C++ et C . . . . . . . . . . . . . . . . . . . . . . 196
Chapitre 11
Unions
1. Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
2. Unions discriminées : exemple météo . . . . . . . . . . . . . . . . . . . . . . . . 202
8 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 12
Tableaux statiques
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
1.1 Principe du tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
1.2 Disposer d'un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
1.2.1 Définir et déclarer un tableau . . . . . . . . . . . . . . . . . . . . . 210
1.2.2 Des constantes pour les tailles . . . . . . . . . . . . . . . . . . . . 211
1.2.3 Accéder aux éléments du tableau avec l'opérateur [ ] . . 211
1.2.4 Débordement de tableau. . . . . . . . . . . . . . . . . . . . . . . . . 212
1.2.5 Initialiser un tableau à la déclaration . . . . . . . . . . . . . . . 212
1.2.6 Parcourir un tableau avec une boucle for . . . . . . . . . . . . 213
1.3 Tableaux à plusieurs dimensions. . . . . . . . . . . . . . . . . . . . . . . . 214
1.3.1 Matrice à deux dimensions . . . . . . . . . . . . . . . . . . . . . . . 214
1.3.2 Tableaux à N dimensions . . . . . . . . . . . . . . . . . . . . . . . . 215
1.3.3 Initialiser à la déclaration . . . . . . . . . . . . . . . . . . . . . . . . 216
1.3.4 Parcourir un tableau à plusieurs dimensions . . . . . . . . . 216
1.4 Tableaux comme champ dans une structure . . . . . . . . . . . . . . 217
1.5 Tableaux de structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
1.6 Tableaux d'unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
1.7 Tableaux et fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
1.7.1 Tableaux en global avec fonctions dédiées . . . . . . . . . . 227
1.7.2 Pointeur en paramètre. . . . . . . . . . . . . . . . . . . . . . . . . . . 229
2. Apports du C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
2.1 Boucle for (:) "pour chaque" . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
2.2 Tableaux d'objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
2.2.1 Initialiseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
2.2.2 Fonction reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
2.3 Tableau dans une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
2.3.1 La classe fourmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
2.3.2 La classe fourmiliere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Table des matières 9
Chapitre 13
Chaînes de caractères
1. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
2. Apports du C++ : la classe string . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Chapitre 14
Pointeurs
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
2. Brève description théorique du pointeur. . . . . . . . . . . . . . . . . . . . . . 259
2.1 Adresse mémoire. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
2.2 Une variable pointeur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
2.3 Quatre opérateurs dédiés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
2.4 Cinq utilisations fondamentales . . . . . . . . . . . . . . . . . . . . . . . . 262
2.4.1 En paramètre de fonction . . . . . . . . . . . . . . . . . . . . . . . . 262
2.4.2 Allocation dynamique (éléments seuls
ou tableaux d’éléments) . . . . . . . . . . . . . . . . . . . . . . . . . 262
2.4.3 Établir des relations entre structures, classes ou objets 262
2.4.4 Élaborer des listes chaînées, des arbres, des graphes . . . 263
2.4.5 Établir un polymorphisme de classe
(C++ uniquement). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
3. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
3.1 Déclarer un pointeur dans un programme . . . . . . . . . . . . . . . . 264
3.2 Opérateur adresse : &. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
3.3 Opérateur étoile : *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
3.4 Opérateur flèche : -> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
3.5 Opérateur crochet : [ ] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
10 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 15
Principales utilisations des pointeurs
1. Pointeur en paramètre (passage par référence) . . . . . . . . . . . . . . . . . 303
1.1 Expérimentation avec pointeur classique . . . . . . . . . . . . . . . . . 303
1.2 Simplification de l'écriture avec des références C++. . . . . . . . 305
1.3 Passage avec référence C++ de structures . . . . . . . . . . . . . . . . 306
1.4 Tableau en paramètre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
1.4.1 Tableau à une dimension . . . . . . . . . . . . . . . . . . . . . . . . 311
1.4.2 Tableaux à plusieurs dimensions . . . . . . . . . . . . . . . . . . 313
2. Allocation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
2.1 Structures ou objets dynamiques . . . . . . . . . . . . . . . . . . . . . . . 314
2.1.1 Version structures C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
2.1.2 Version objets C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
2.2 Utiliser un tableau de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . 321
2.2.1 Tableau de pointeurs de structures C . . . . . . . . . . . . . . 322
2.2.2 Tableau de pointeurs d'objets C++. . . . . . . . . . . . . . . . 326
2.3 Validité d'une adresse mémoire . . . . . . . . . . . . . . . . . . . . . . . . . 329
3. Allocation dynamique de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . 331
3.1 Tableaux dynamiques une dimension. . . . . . . . . . . . . . . . . . . . 331
3.1.1 Tableau dynamique de int . . . . . . . . . . . . . . . . . . . . . . . 331
3.1.2 Tableau dynamique dans une classe . . . . . . . . . . . . . . . 332
3.2 Tableaux dynamiques de plusieurs dimensions . . . . . . . . . . . . 340
3.2.1 Allocation dynamique d'une matrice de int. . . . . . . . . . 340
3.2.2 Allocation dynamique d'une forme
à 6 dimensions de points. . . . . . . . . . . . . . . . . . . . . . . . . 342
4. Associer des structures ou des classes . . . . . . . . . . . . . . . . . . . . . . . . 345
4.1 Association de deux structures C de types différents . . . . . . . 345
4.1.1 Structures avion et pilote . . . . . . . . . . . . . . . . . . . . . . . . 345
4.1.2 Relier avion et pilote . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
4.1.3 Délier un avion et un pilote . . . . . . . . . . . . . . . . . . . . . . 346
4.1.4 Constructeurs avion et pilote . . . . . . . . . . . . . . . . . . . . . 347
4.1.5 Afficher Avion et Pilote. . . . . . . . . . . . . . . . . . . . . . . . . . 348
12 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 16
Gestion des erreurs
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
2. Socle hérité du C. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
2.1 Retourner un booléen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
2.2 Retourner un numéro d'erreur . . . . . . . . . . . . . . . . . . . . . . . . . . 375
2.3 Afficher des informations au moment de l'erreur . . . . . . . . . . 377
3. Fonctionnement et syntaxe des exceptions C++ . . . . . . . . . . . . . . 382
3.1 Instruction throw. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
3.2 Instruction de saut try-catch . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
3.3 Instruction throw et appels de fonctions . . . . . . . . . . . . . . . . . 384
3.4 Instruction throw sans valeur de retour . . . . . . . . . . . . . . . . . . 386
3.5 Bloc catch(...) par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
3.6 Exception non gérée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
3.7 La fonction terminate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
3.8 La fonction unexpected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
4. Utilisation de la classe exception. . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
4.1 Utiliser les exceptions standards du C++ . . . . . . . . . . . . . . . . 392
4.2 Mise à jour de outils.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
4.2.1 Formalisme et style de la présentation . . . . . . . . . . . . . 396
4.2.2 Contrôle d'erreur dans la fonction GetStdout . . . . . . . . 396
4.2.3 Contrôle d'une taille minimum de fenêtre
pour ConsoleResize() . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
4.2.4 Possibles exceptions dans ConsoleResize() . . . . . . . . . . 398
4.3 Conseil sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Table des matières 13
Chapitre 17
Deux automates cellulaires
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
2. Simulation de feux de forêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
2.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
2.2 Mise en forme et initialisation. . . . . . . . . . . . . . . . . . . . . . . . . . 409
2.2.1 Structures de données . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
2.2.2 Dimensionner la console et les deux matrices . . . . . . . . 410
2.2.3 Initialisation des bois. . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
2.2.4 Initialisation du feu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
2.3 Afficher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
2.3.1 Premier type d'affichage, lent . . . . . . . . . . . . . . . . . . . . . 413
2.3.2 Affichage très rapide direct mémoire . . . . . . . . . . . . . . . 414
2.4 Processus générateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
2.4.1 Fonction de propagation . . . . . . . . . . . . . . . . . . . . . . . . . 416
2.4.2 Boucle du processus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
2.4.3 Destruction des matrices . . . . . . . . . . . . . . . . . . . . . . . . 419
2.5 Texte complet du programme . . . . . . . . . . . . . . . . . . . . . . . . . . 419
2.6 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
3. Automate cellulaire type Conway. . . . . . . . . . . . . . . . . . . . . . . . . . . 430
3.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
3.2 Mise en forme et initialisation. . . . . . . . . . . . . . . . . . . . . . . . . . 431
3.2.1 Structures de données de l'automate . . . . . . . . . . . . . . . 431
3.2.2 Déterminer la taille de la fenêtre console. . . . . . . . . . . . 431
3.2.3 Allocation et initialisation des matrices. . . . . . . . . . . . . 432
3.3 Processus générateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
3.3.1 Fonction calcul. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
3.3.2 Comptage des voisins . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
3.3.3 Recopie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
3.4 Afficher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
3.4.1 Première version : affichage lent. . . . . . . . . . . . . . . . . . . 435
3.4.2 Affichage direct mémoire : rapide . . . . . . . . . . . . . . . . . 436
14 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 19
Surcharge des opérateurs
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
2. Fonction operator globale hors classe . . . . . . . . . . . . . . . . . . . . . . . . 546
3. Fonction operator localisée dans une classe . . . . . . . . . . . . . . . . . . . 547
3.1 Operator+ sans retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
3.2 Operator+ avec retour de l'objet courant (*this). . . . . . . . . . . 549
3.3 Opérator+ avec retour d'un nouvel objet résultant. . . . . . . . . 551
4. Fonction operator et données dynamiques. . . . . . . . . . . . . . . . . . . . 552
4.1 Surcharge operator+ dans la classe Tab . . . . . . . . . . . . . . . . . . 553
4.2 Surcharge de l'opérateur d'affectation =. . . . . . . . . . . . . . . . . . 555
5. Objet-fonction (ou fonction-objet) . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Chapitre 20
Classes et membres static
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
2. Qualificatif static en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
3. Qualificatif static et objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
4. Exemple : static pour une classe Console . . . . . . . . . . . . . . . . . . . . . 566
4.1 Utiliser le patron de conception "Singleton". . . . . . . . . . . . . . . 567
4.2 Singleton pour une classe console . . . . . . . . . . . . . . . . . . . . . . . 570
Table des matières 17
Chapitre 21
Classes génériques
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
2. Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
3. Syntaxe de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
4. Syntaxe des constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
5. Syntaxe avec plusieurs types génériques. . . . . . . . . . . . . . . . . . . . . . 592
6. Paramétrage d’une classe générique. . . . . . . . . . . . . . . . . . . . . . . . . . 592
7. Exemple d'implémentation d'une pile générique . . . . . . . . . . . . . . . 598
8. Spécialisation de fonction sur un type donné. . . . . . . . . . . . . . . . . . 601
9. Spécialiser une classe entière . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
9.1 Spécialisation partielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
9.2 Spécialisation complète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Chapitre 22
Classe d'objets changeants
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
2. Rappel union discriminée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
3. Principe de l'union illimitée : exemple météo mis à jour . . . . . . . . . 609
18 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 23
Associations entre objets
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
2. Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
3. Principes des associations pour les relations entre objets . . . . . . . . 625
3.1 Association simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
3.2 Agrégation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
3.3 Composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
3.4 Problème syntaxique en C++. . . . . . . . . . . . . . . . . . . . . . . . . . 626
4. Associations simples : messages entre objets . . . . . . . . . . . . . . . . . . 627
4.1 Liaison non réciproque entre deux objets . . . . . . . . . . . . . . . . . 627
4.2 Liaison réciproque entre deux objets. . . . . . . . . . . . . . . . . . . . . 629
5. Agrégations : coopération entre objets . . . . . . . . . . . . . . . . . . . . . . . 632
5.1 Liaison à sens unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
5.1.1 Cas général, syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
5.1.2 Guitariste et guitare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
5.2 Partage d'objets pointés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
5.2.1 Musiciens simultanés . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
5.2.2 Plusieurs musiciens successifs. . . . . . . . . . . . . . . . . . . . . 638
6. Liaisons réciproques entre objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
6.1 Problème de syntaxe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
6.2 Déclaration de type incomplet . . . . . . . . . . . . . . . . . . . . . . . . . 641
6.3 Limite du type incomplet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
6.4 Résolution du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
6.5 Piège d'une liaison réciproque . . . . . . . . . . . . . . . . . . . . . . . . . . 648
6.6 Exemple Terminator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
7. Composition : dépendance entre objets . . . . . . . . . . . . . . . . . . . . . . 654
7.1 De l'agrégation à la composition . . . . . . . . . . . . . . . . . . . . . . . . 654
7.2 Techniques envisageables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
7.3 Pointeur d'objet en propriété . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
7.4 Objet en propriété . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Table des matières 19
Chapitre 24
Héritage
1. Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
2. Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
3. Définir une classe dérivée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
4. Appeler explicitement un constructeur de la classe de base . . . . . . 675
5. Redéfinition de données ou de fonctions . . . . . . . . . . . . . . . . . . . . . 676
6. Spécifier un membre de la classe de base . . . . . . . . . . . . . . . . . . . . . 678
7. Droits d'accès locaux de la classe héritée. . . . . . . . . . . . . . . . . . . . . . 679
8. Droits d'accès globaux de la classe héritée . . . . . . . . . . . . . . . . . . . . 682
9. Héritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
9.1 Principe et syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
9.2 Exemple : InDominusRex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
9.3 Relations transversales dans un arbre de classes . . . . . . . . . . . 691
9.4 Héritage multiple avec une base virtuelle . . . . . . . . . . . . . . . . . 694
10. Distinction entre héritage et association . . . . . . . . . . . . . . . . . . . . . 698
11. Mise en pratique héritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
11.1 Comment identifier un héritage ? . . . . . . . . . . . . . . . . . . . . . . . 699
11.2 Les exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
20 Langage C++
L'héritage du C et la programmation orientée objet
Chapitre 25
Polymorphisme et virtualité
1. Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
2. Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
3. Accès pointeurs limité par son type . . . . . . . . . . . . . . . . . . . . . . . . . 708
4. Autorisation d'accès pour les fonctions virtuelles . . . . . . . . . . . . . . 710
5. Destructeur virtuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
6. Intérêt des fonctions virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
7. Exemple : virtualité dans la classe standard exception . . . . . . . . . . 715
Chapitre 26
Classe abstraite et interface
1. Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
2. Classe abstraite, fonctions virtuelles pures. . . . . . . . . . . . . . . . . . . . 722
3. Tronc commun pour dériver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
4. Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
5. Résumé classe abstraite et interface . . . . . . . . . . . . . . . . . . . . . . . . . 731
6. Expérimentation : exemples des super héros, les Avengers . . . . . . . 732
6.1 Classe de base super héros, interface
des fonctions d'action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
6.2 Une dérivée pour chaque Avengers . . . . . . . . . . . . . . . . . . . . . . 738
6.3 Souhait du polymorphisme et impossibilité. . . . . . . . . . . . . . . 742
6.4 Virtualité, intérêt de l'interface des fonctions d'action . . . . . . 744
6.5 Classe abstraite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
6.6 Version finale Avengers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
7. Mise en pratique classe abstraite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Table des matières 21
Chapitre 27
Quelques comparaisons entre C et C++
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
2. Sur les utilisations de pointeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
2.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
2.2 Opérateurs de pointeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
2.3 Fonctionnement des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . 767
2.4 Utilisation 1 : en paramètre de fonction . . . . . . . . . . . . . . . . . . 769
2.5 Utilisation 2 : mise en relation d’éléments . . . . . . . . . . . . . . . . 772
2.6 Utilisation 3 : allocation dynamique. . . . . . . . . . . . . . . . . . . . . 775
3. Sur l'utilisation des paramètres et retours de fonctions . . . . . . . . . . 783
3.1 Encapsulation des données C et C++ . . . . . . . . . . . . . . . . . . . 783
3.2 Généralisation du code C et C++ . . . . . . . . . . . . . . . . . . . . . . 784
3.3 Paramètres et retours C++ : la communication entre objets 785
4. Sur l'utilisation de l'union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
4.1 Principe d'une union hiérarchisée en C . . . . . . . . . . . . . . . . . . . 785
4.2 Traduction en C++ d'une union hiérarchisée . . . . . . . . . . . . . 789
4.3 Exemple : une diversité d'ennemis avec une union en C . . . . . 791
4.4 Traduction C++ avec une base et des dérivées . . . . . . . . . . . 800
4.5 Intérêt spécifique de l'union en C++ . . . . . . . . . . . . . . . . . . . 805
5. Sur l'utilisation du typedef. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Chapitre 16
Gestion des erreurs
1. Introduction
Gestion des erreurs
2. Socle hérité du C
– Nous sommes obligés de traiter tous les cas possibles : largeur et hauteur
peuvent être diminuées toutes les deux, ou augmentées toutes les deux, ou
l'une augmentée et l'autre diminuée. Pour ce faire, nous commençons par
traiter la hauteur qui peut être soit diminuée, soit augmentée et de même
ensuite avec la largeur.
La fonction ConsoleResize() prend en paramètre les largeur et hauteur deman-
dées, elle retourne un booléen qui indique avec false une sortie sur erreur et
avec true la réussite du processus. Voici la fonction complète :
bool ConsoleResize(int width, int height)
{
CONSOLE_SCREEN_BUFFER_INFO info;
COORD max;
// un HANDLE est un synonyme de void* défini dans windows.h
HANDLE h;
if (!GetConsoleScreenBufferInfo(h, &info))
return FALSE;
return FALSE;
}
// si la taille demandée est supérieure à la taille actuelle
else if (height > info.dwSize.Y) {
info.srWindow.Right = width - 1;
if (!SetConsoleWindowInfo(h, TRUE, &info.srWindow))
return FALSE;
info.dwSize.X = width;
if (!SetConsoleScreenBufferSize(h, info.dwSize))
return FALSE;
}
else if (width > info.dwSize.X) {
info.dwSize.X = width;
if (!SetConsoleScreenBufferSize(h, info.dwSize))
return FALSE;
info.srWindow.Right = width - 1;
if (!SetConsoleWindowInfo(h, TRUE, &info.srWindow))
return FALSE;
}
return TRUE;
}
372 Langage C++
L'héritage du C et la programmation orientée objet