C++
4e édition
Des fondamentaux du langage aux applications
Brice-Arnaud Guérin
Éditions ENI
Avant-propos
1. Objectifs de ce livre13
2. Travaux pratiques15
Chapitre 1
Premiers pas en C++
1. Notions clés17
1.1 Principales caractéristiques du langage C++17
1.2 Programmation orientée objet19
1.3 Environnement de développement et fichier makefile22
1.3.1 Choix d'un EDI22
1.3.2 Construction d'un fichier makefile23
1.4 Organisation d'un programme C++27
1.4.1 Codes sources27
1.4.2 Modules objets30
1.4.3 Bibliothèques (librairies)33
1.4.4 Exécutable35
1.5 Préprocesseur36
1.6 Choix d'un compilateur36
1.7 Éditeur de liens38
2. Les premiers programmes38
2.1 Les commentaires39
2.2 Déclaration de variables39
2.2.1 Utilité des variables39
2.2.2 Portée des variables41
2.2.3 Syntaxe de déclaration43
2.2.4 Types de données43
2.2.5 Les types entiers44
2.2.6 Les types décimaux48
2.2.7 Le booléen50
2.2.8 Les caractères et les chaînes50
2.3 Instructions de tests et opérateurs52
2.3.1 Instructions de tests52
2.3.2 Opérateurs55
2.3.3 Opérateurs booléens59
2.3.4 Opérateurs d'incrémentation60
2.3.5 Instructions de boucle61
2.3.6 La boucle while61
2.3.7 La boucle for62
2.3.8 La boucle do63
2.3.9 Les instructions de débranchement63
3. Tableaux54
3.1 Déclarer des tableaux66
3.2 Tableaux dynamiques67
4. Fonctions et prototypes68
4.1 Déclaration d'une fonction69
4.2 Fonctions et procédures70
4.3 Appel des fonctions71
4.4 Gestion des variables locales72
4.5 Définition de fonctions homonymes (polymorphisme)73
4.6 Fonctions à nombre variable d'arguments74
4.7 Attribution de valeurs par défaut aux arguments75
4.8 Fonctions en ligne76
4.9 Fonctions externes de type C77
4.10 Fonctions récursives77
4.11 La fonction main()79
Chapitre 2
De la mémoire pour les programmes
1. Pointeurs81
1.1 Pointeurs sur des variables82
1.2 Pointeurs et tableaux86
1.3 Allocation de mémoire88
1.3.1 Allocation par malloc()89
1.3.2 Allocation par new90
1.4 Arithmétique des pointeurs91
1.5 Pointeurs de pointeurs92
1.6 Pointeurs de fonctions93
1.6.1 Utilisation pour rendre les algorithmes génériques94
1.6.2 Fonctions callback99
2. Références101
2.1 Une plus grande sécurité103
2.2 Les références constantes103
2.3 Renvoyer une référence depuis une fonction103
3. Constantes104
3.1 Constantes symboliques104
3.2 Le type void105
3.3 Les alias de type : typedef106
3.4 Constantes et énumérations106
4. Exercices pratiques107
4.1 Rechercher la valeur maximale dans un tableau107
4.1.1 Déclaration du tableau107
4.1.2 Implémentation de l'algorithme sous forme d'une fonction107
4.1.3 Exécution de l'algorithme108
4.2 Rechercher l'adresse de la valeur maximale dans un tableau108
4.3 Utiliser les références pour rechercher l'index de la valeur maximale dans un tableau109
Chapitre 3
Structuration des données
1. Programmation structurée111
1.1 Structures112
1.2 Constitution d'une structure113
1.3 Instanciation de structures114
1.4 Instanciation au moment de la définition114
1.5 Instanciation par réservation de mémoire115
1.6 Instanciation avec l'opérateur new116
1.7 Pointeurs et structures116
1.8 Organisation de la programmation118
1.8.1 Inclusion à l'aide de #include118
1.8.2 Protection contre les inclusions multiples118
1.9 Unions119
1.10 Copie de structures122
1.11 Création d'alias de types de structures124
2. Structures et fonctions125
2.1 Passer comme paramètre une structure par valeur125
2.2 Passer comme paramètre une structure par référence126
2.3 Passer comme paramètre une structure par adresse127
2.4 De la programmation fonctionnelle à la programmation objet127
2.5 Gestion de la mémoire128
2.5.1 Alignement des données129
2.5.2 Allocation de mémoire interprocessus130
3. La bibliothèque standard du C131
3.1 Les fonctions communes du langage C <stdlib.h>131
3.2 Chaînes <string.h>132
3.3 Fichiers <stdio.h>135
4. Exercices pratiques140
4.1 Les structures140
4.2 La fonction d'initialisation140
4.3 Les fonctions d'affichage141
4.4 Les fonctions d'entrées et de sorties142
4.5 La fonction principale144
4.6 Exécution du programme et tests145
Chapitre 4
La programmation orientée objet
1. Classes et instances147
1.1 Définition de classe148
1.2 Les modificateurs d'accès149
1.3 Organisation de la programmation des classes153
1.4 Instanciation155
1.5 Constructeur156
1.6 Le pointeur this158
1.7 Destructeur159
1.8 Destructeur virtuel160
1.9 Allocation dynamique161
1.10 Constructeur de copie163
2. Héritage164
2.1 Dérivation de classe (héritage)164
2.2 Exemple de dérivation de classe165
2.3 Héritage public, protégé et privé169
2.4 Appel des constructeurs170
2.5 Polymorphisme171
2.6 Méthodes polymorphes171
2.7 Conversions d'objets172
2.8 Méthodes virtuelles et méthodes virtuelles pures173
2.9 Héritage multiple178
2.10 Notations particulières pour l'héritage multiple179
2.11 Conséquences de l'héritage multiple sur la programmation181
3. Autres aspects de la POO183
3.1 Conversion dynamique183
3.1.1 Conversions depuis un autre type183
3.1.2 Opérateurs de conversion185
3.1.3 Conversions entre classes dérivées186
3.2 Champs et méthodes statiques187
3.2.1 Champs statiques187
3.2.2 Méthodes statiques189
3.3 Surcharge d'opérateurs193
3.3.1 Syntaxe193
3.3.2 Surcharge de l'opérateur d'indexation195
3.3.3 Surcharge de l'opérateur d'affectation196
3.3.4 Surcharge de l'opérateur de conversion196
3.4 Fonctions amies197
3.5 Adressage relatif et pointeurs de membres198
3.5.1 Notations199
3.5.2 Construction d'un middleware orienté objet200
4. Les exceptions plus sûres que les erreurs206
4.1 Propagation explicite208
4.2 Types d'exceptions personnalisés209
4.2.1 Définition de classes d'exception209
4.2.2 Instanciation de classes210
4.2.3 Classes d'exception dérivées211
4.3 Prise en charge d'une exception et relance212
4.4 Exceptions non interceptées213
4.5 Acquisition de ressources213
5. Programmation générique216
5.1 Modèles de fonctions216
5.2 Modèles de classes221
6. Travaux pratiques225
6.1 Utilisation de l'héritage de classes dans l'interprète tiny-lisp225
6.2 Des pointeurs de membres pour des fonctions callback227
Chapitre 5
La librairie standard STL
1. Introduction233
2. Organisation des programmes234
2.1 Espaces de noms234
2.1.1 Utilisation complète d'un espace de noms236
2.1.2 Espace de noms réparti sur plusieurs fichiers237
2.1.3 Relation entre classe et espace de noms238
2.1.4 Déclaration de sous-espaces de noms240
2.2 Présentation de la librairie STL241
3. Flux C + + (entrées-sorties)241
3.1 Généralités242
3.2 Flux intégrés243
3.3 État d'un flux243
3.4 Mise en forme244
3.5 Flux de fichiers245
3.6 Flux de chaînes247
3.7 Paramètres locaux248
4. Classe string pour la représentation des chaînes de caractères250
4.1 Représentation des chaînes dans la librairie STL251
4.2 Mode d'emploi de la classe string252
4.2.1 Fonctions de base252
4.2.2 Constructeurs252
4.2.3 Itérateurs253
4.2.4 Accès aux éléments253
4.3 Intégration dans le langage C+ +254
4.3.1 Affectations254
4.3.2 Comparaisons254
4.3.3 Conversion avec le C255
4.4 Fonctions spécifiques aux chaînes256
4.4.1 Insertion256
4.4.2 Concaténation256
4.4.3 Recherche et remplacement257
4.4.4 Extraction de sous-chaîne258
5. Conteneurs dynamiques258
5.1 Conteneurs259
5.1.1 Insertion d'éléments et parcours260
5.1.2 Itérateurs260
5.1.3 Opérations applicables à un vecteur261
5.2 Conteneurs standard262
5.2.1 Itérateurs263
5.2.2 Accès aux éléments263
5.2.3 Opérations sur pile et file263
5.2.4 Opérations sur listes263
5.2.5 Opérations associatives264
5.3 La séquence list264
5.4 La séquence deque266
5.5 Adaptateurs de séquences266
5.6 La pile stack266
5.7 La file queue267
5.8 La file d'attente à priorité270
5.9 Le conteneur associatif map270
5.10 Les conteneurs associatifs multimap, set et multiset271
6. Algorithmes272
6.1 Opérations de séquence sans modification272
6.2 Opérations de séquence avec modification273
6.3 Séquences triées274
6.4 Algorithmes ensemblistes275
6.5 Minimum et maximum275
6.6 Calcul numérique276
6.6.1 Limites des formats ordinaires276
6.6.2 Fonctions de la bibliothèque277
6.6.3 Fonctions de la bibliothèque standard et classe valarray278
7. Des apports du C + + moderne279
7.1 Les lambda-expressions279
7.2 L'inférence de type281
7.3 De nouveaux types de boucles283
7.4 Des pointeurs intelligents285
8. Introduction à la bibliothèque boost289
8.1 Installation de la bibliothèque289
8.2 Un premier exemple avec boost291
8.3 Domaines d'application293
9. Travaux pratiques294
9.1 La classe Variant294
9.2 La méthode to_string()296
9.3 La traduction JSON297
9.3.1 La méthode statique to_json_string()297
9.3.2 La méthode statique fromJson_string()299
Chapitre 6
Les environnements de C++
1. L'environnement Windows303
1.1 Les programmes Win32303
1.1.1 Choix du mode de compilation304
1.1.2 Fonctionnement des applications fenêtrées Win32305
1.1.3 Création d'un projet d'application fenêtrée306
1.1.4 Les types de données Win32309
1.1.5 Les handles et les messages310
1.1.6 La boucle de message311
1.1.7 Les fichiers de ressource312
1.2 L'environnement .NET314
1.2.1 Le code managé et la machine virtuelle CLR314
1.2.2 Les adaptations du langage C+ + CLI315
1.2.3 La norme CTS315
1.2.4 La classe System : :String318
1.2.5 Le garbage collector320
1.2.6 Fonctionnement du ramasse-miettes321
1.2.7 Les tableaux et les fonctions à nombre variable d'arguments330
1.2.8 Les propriétés332
1.2.9 Les délégués et les événements334
1.2.10 Les méthodes virtuelles336
1.2.11 Les classes abstraites et les interfaces338
1.2.12 Le framework .NET339
1.2.13 Les références d'assemblages340
1.2.14 L'espace de noms System : :IO341
1.2.15 L'espace de noms System : :Xml342
1.2.16 L'espace de noms System : :Data343
1.2.17 L'espace de noms System : :Collections344
1.2.18 L'espace de noms System : :Collections : :Generic345
1.3 Les relations avec les autres langages : exemple du C#346
2. Applications348
2.1 Réaliser une application de dessin Win32348
2.2 Une application en C+ + pour .NET : le tableur InCell357
2.2.1 Architecture du tableur357
2.2.2 La feuille de calcul358
2.2.3 L'ordonnanceur de calcul367
2.2.4 Zoom sur l'évaluateur374
2.2.5 L'interface graphique372
2.3 Un module de gestion de données pour tiny-lisp373
2.3.1 Création de listes persistantes db_create374
2.3.2 Accès aux listes persistantes db_use375
2.3.3 Insertion d'items db_insert376
2.3.4 Enregistrement des listes persistantes db_save378
2.3.5 Sélection d'items dans les listes persistantes db_select379
Chapitre 7
Programmer des algorithmes en C++
1. Introduction383
2. Reconnaissance de motifs textuels383
2.1 Approche directe384
2.2 Lecture avec déplacement : l'algorithme Boyer-Moore386
2.3 Méthode pour les motifs auto répétitifs : l'algorithme KMP387
3. Recherche du plus court chemin391
3.1 Présentation des graphes392
3.1.1 Incidence et adjacence394
3.1.2 Chemin d'un graphe394
3.1.3 Le parcours de graphe en largeur d'abord398
3.2 L'algorithme de Dijkstra401
3.3 Utilisation d'une méthode avec euristique : l'algorithme A*404
4. Comprimer des fichiers415
4.1 Approche par statistique : l'algorithme d'Huffman415
4.1.1 Implémentation du codage416
4.1.2 Compression du fichier420
4.1.3 Décompression422
4.2 Approche par dictionnaire : l'algorithme LZW423
4.2.1 Fonctionnement de l'algorithme423
4.2.2 Implémentation du dictionnaire424
4.2.3 Dimensionnement et gestion du dictionnaire429
4.2.4 Programme de compression429
4.2.5 Programme de décompression431
5. Implémenter un réseau de neurones en C++434
5.1 Un réseau de neurones pour l'algorithmique ?434
5.2 Implémentation d'un réseau de neurones en C+ +435
5.3 Une classe abstraite pour piloter le réseau439
5.4 Modéliser une porte logique440
5.5 Un moteur d'inférence pour l'arithmétique entière442
5.5.1 Apprentissage des symboles444
5.5.2 Utilisation du réseau445
Index451