Programmer en C++ moderne
De C++11 à C++20
Claude Delannoy
Eyrolles
Chapitre 1 : Présentation du langage C++1
1 - Programmation structurée et programmation orientée objet
2
1.1 Problématique de la programmation2
1.2 La programmation structurée2
1.3 Les apports de la programmation orientée objet3
1.3.1 Objet
3
1.3.2 Encapsulation
3
1.3.3 Classe
4
1.3.4 Héritage
4
1.3.5 Polymorphisme
4
1.4 P.O.O., langages de programmation et C++4
2 - C++ et la programmation structurée
5
3 - C++ et la programmation orientée objet
6
4 - C et C++
8
5 - C++ et les bibliothèques standards
9
Chapitre 2 : Généralités sur le langage C++11
1 - Présentation par l'exemple de quelques instructions du langage C++
12
1.1 Un exemple de programme en langage C++12
1.2 Structure d'un programme en langage C++13
1.3 Déclarations13
1.4 Pour écrire des informations : utiliser le flot cout14
1.5 Pour faire une répétition : l'instruction for14
1.6 Pour lire des informations : utiliser le flot cin15
1.7 Pour faire des choix : l'instruction if15
1.8 Les directives à destination du préprocesseur16
1.9 L'instruction using17
1.10 Exemple de programme utilisant le type caractère17
2 - Quelques règles d'écriture
18
2.1 Les identificateurs18
2.2 Les mots-clés19
2.3 Les séparateurs19
2.4 Le format libre19
2.5 Les commentaires20
2.5.1 Les commentaires libres
20
2.5.2 Les commentaires de fin de ligne
21
3 - Création d'un programme en C++
22
3.1 L'édition du programme22
3.2 La compilation22
3.3 L'édition de liens22
3.4 Les fichiers en-tête23
Chapitre 3 : Les types de base de C++25
1 - La notion de type
25
2 - Les types entiers
26
2.1 Les différents types usuels d'entiers prévus par C++26
2.2 Leur représentation en mémoire27
2.3 Les types entiers non signés28
2.4 Notation des constantes littérales entières28
3 - Les types flottants
29
3.1 Les différents types et leur représentation en mémoire29
3.2 Notation des constantes littérales flottantes30
4 - Les types caractères
31
4.1 La notion de caractère en langage C++31
4.2 Notation des constantes littérales de type caractère32
5 - Le type bool
33
6 - Déclaration des variables
34
7 - Initialisation des variables
34
7.1 Généralités34
7.2 Notations de l'initialisation35
7.2.1 La notation parenthésée
35
7.2.2 La notation avec accolades (C++11)
35
8 - Constantes et expressions constantes
36
8.1 Le modificateur const36
8.2 Le modificateur constexpr (C++11)36
9 - Déclarations automatiques (C++11)
37
9.1 Le mot-clé auto37
9.2 Le mot-clé décltype37
10 - Le mot-clé volatile
38
Chapitre 4 : Opérateurs et expressions39
1 - Originalité des notions d'opérateur et d'expression en C++
39
2 - Les opérateurs arithmétiques en C++
41
2.1 Présentation des opérateurs41
2.2 Les priorités relatives des opérateurs42
2.3 Comportement des opérateurs en cas d'opération impossible42
3 - Les conversions implicites pouvant intervenir dans un calcul d'expression
44
3.1 Notion d'expression mixte44
3.2 Les conversions usuelles d'ajustement de type44
3.3 Les promotions numériques usuelles45
3.3.1 Généralités
45
3.3.2 Cas du type char
46
3.3.3 Cas du type bool
47
3.4 Les conversations en présence de types non signés47
3.4.1 Cas des entiers
47
3.4.2 Cas des caractères
48
4 - Les opérateurs relationnels
49
5 - Les opérateurs logiques
51
5.1 Rôle51
5.2 Court-circuit dans l'évaluation de (...) et (...)52
6 - L'opérateur d'affectation ordinaire
53
6.1 Notion de lvalue53
6.2 L'opérateur d'affectation possède une associativité de droite à gauche54
6.3 L'affectation peut entraîner une conversion54
7 - Opérateurs d'incrémentation et de décrémentation
54
7.1 Leur rôle54
7.2 Leurs priorités56
7.3 Leur intérêt56
8 - Les opérateurs d'affectation élargie
56
9 - Les conversions forcées par une affectation
57
9.1 Cas usuels57
9.2 Prise en compte d'un attribut de signe58
10 - L'opérateur de cast
58
11 - L'opérateur conditionnel
59
12 - L'opérateur séquentiel
60
13 - L'opérateur sizeof
62
14 - Les opérateurs de manipulation de bits
62
14.1 Présentation des opérateurs de manipulation de bits62
14.2 Les opérateurs bit à bit63
14.3 Les opérateurs de décalage64
14.4 Exemples d'utilisation des opérations de bits64
15 - Récapitulatif des priorités de tous les opérateurs
65
Chapitre 5 : Les entrées-sorties conversationnelles de C++67
1 - Affichage à l'écran
67
1.1 Exemple 168
1.2 Exemple 268
1.3 Les possibilités d'écriture sur cout69
2 - Lecture au clavier
70
2.1 Introduction70
2.2 Les différentes possibilités de lecture sur cin71
2.3 Notions de tampon et de caractères séparateurs71
2.4 Premières règles utilisées par >>72
2.5 Présence d'un caractère invalide dans une donnée72
2.6 Les risques induits par la lecture au clavier73
2.6.1 Manque de synchronisme entre clavier et écran
73
2.6.2 Blocage de la lecture
74
2.6.3 Boucle infinie sur un caractère invalide
74
Chapitre 6 : Les instructions de contrôle77
1 - Les blocs d'instructions
78
1.1 Blocs d'instructions78
1.2 Déclarations dans un bloc79
2 - L'instruction if
79
2.1 Syntaxe de l'instruction if80
2.2 Exemples80
2.3 Imbrication des instructions if81
3 - L'instruction switch
83
3.1 Exemples d'introduction de l'instruction switch83
3.2 Syntaxe de l'instruction switch86
4 - L'instruction do... while
88
4.1 Exemple d'introduction de l'instruction do... while88
4.2 Syntaxe de l'instruction do... while89
5 - L'instruction while
90
5.1 Exemple d'introduction de l'instruction while90
5.2 Syntaxe de l'instruction while91
6 - L'instruction for
92
6.1 Exemple d'introduction de l'instruction for92
6.2 L'instruction for en général93
6.3 Syntaxe de l'instruction for94
7 - Les instructions de branchement inconditionnel : break, continue et goto
97
7.1 L'instruction break97
7.2 L'instruction continue98
7.3 L'instruction goto99
8 - Initialisation dans les instructions if et switch (C++17)
100
Chapitre 7 : Les fonctions103
1 - Exemple de définition et d'utilisation d'une fonction
104
2 - Quelques règles
106
2.1 Arguments muets et arguments effectifs106
2.2 L'instruction return106
2.3 Cas des fonctions sans valeur de retour ou sans arguments107
3 - Les fonctions et leurs déclarations
109
3.1 Les différentes façons de déclarer une fonction109
3.2 Où placer la déclaration d'une fonction109
3.3 Contrôles et conversions induites par le prototype110
4 - Transmission des arguments par valeur
110
4.1 Cas général110
4.2 Transmission par valeur et constance des arguments112
4.2.1 Cas des arguments effectifs constants
112
4.2.2 Cas des arguments muets constants
112
5 - Transmission des arguments par référence
113
5.1 Exemple de transmission d'arguments par référence113
5.2 Propriétés de la transmission par référence d'un argument114
5.3 Référence à un argument muet constant114
5.4 Induction de risques indirects115
6 - Les variables globales
116
6.1 Exemple d'utilisation de variables globales116
6.2 La portée des variables globales117
6.3 La classe d'allocation des variables globales118
7 - Les variables locales
118
7.1 La portée des variables locales118
7.2 Les variables locales automatiques119
7.3 Les variables locales statiques120
7.4 Variables locales à un bloc121
7.5 Le cas des fonctions récursives122
8 - Transmission par référence d'une valeur de retour
122
8.1 Introduction123
8.2 Conséquences dans la définition de la fonction123
8.3 Conséquences dans l'utilisation de la fonction123
8.4 Exemple124
8.5 Valeur de retour constante125
9 - Initialisation des variables
125
9.1 Les variables de classe statique126
9.2 Les variables de classe automatique126
10 - Les arguments par défaut
127
10.1 Exemples127
10.2 Les propriétés des arguments par défaut129
11 - Surdéfinition de fonctions
129
11.1 Mise en oeuvre de la surdéfinition de fonctions130
11.2 Exemples de choix d'une fonction surdéfinie131
11.3 Règles de recherche d'une fonction surdéfinie133
11.3.1 Cas des fonctions à un argument
133
11.3.2 Cas des fonctions à plusieurs arguments
134
12 - Les fonctions et la déclaration auto (C++11)
135
12.1 Déclaration automatique du type des valeurs de retour135
12.2 Déclaration automatique du type des arguments muets135
12.3 Combinaison des deux possibilités136
13 - Les fonctions déclarées constexpr (C++11)
136
14 - La référence d'une manière générale
137
14.1 Déclaration de variables de type référence137
14.2 Initialisation de référence138
15 - Les fonctions à arguments variables
139
15.1 Le type initializer_list (C++11)139
15.2 Application à une fonction à nombre variable d'arguments (C++11)141
15.3 Les anciennes fonctions va_start et va_arg142
16 - Conséquences de la compilation séparée
144
16.1 Compilation séparée et prototypes144
16.2 Fonction manquante lors de l'édition de liens145
16.3 Le mécanisme de la surdéfinition de fonctions145
16.4 Compilation séparée et variables globales147
16.4.1 La portée d'une variable globale - la déclaration extern
147
16.4.2 Les variables globales et l'édition de liens
147
16.4.3 Les variables globales cachées - la déclaration static
148
17 - La spécification inline
148
18 - Terminaison d'un programme
151
Chapitre 8 : Le type string153
1 - Déclaration et initialisation
153
2 - Lecture et écriture de chaînes
155
3 - Affectation de chaînes
156
4 - Les fonctions size et empty
156
5 - Concaténation de chaînes
157
6 - Accès aux caractères d'une chaîne
158
6.1 Accès à un caractère de rang donné158
6.1.1 Généralités
158
6.1.2 Absence de contrôle d'indice
158
6.1.3 Exemple
159
6.2 Traitement de tous les caractères d'une chaîne160
6.2.1 Cas général
160
6.2.2 L'instruction for pour les séquences
160
6.2.3 Exemple
161
7 - Les chaînes en argument d'une fonction
161
8 - Les autres possibilités du type string
162
Chapitre 9 : Les pointeurs natifs163
1 - Notion de pointeur - Les opérateurs * et (...)
164
1.1 Introduction164
1.2 Déclarations multiples et emploi des opérateurs * et (...)165
1.3 Exemple166
2 - Affectation et comparaison de pointeurs
168
2.1 Affectation de pointeurs168
2.2 Comparaisons de pointeurs168
2.3 Le pointeur nul168
2.4 Conversion implicite en bool169
3 - Les conversions entre pointeurs
170
4 - Les pointeurs génériques
170
5 - Pointeurs et constance
171
5.1 Pointeur sur un élément constant171
5.2 Pointeur constant172
5.3 Pointeur constant sur un élément constant173
5.4 Constexpr et les pointeurs (C++11)173
6 - Comment simuler une transmission par adresse avec un pointeur
174
7 - Pointeurs et surdéfinition de fonctions
176
8 - Utilisation de pointeurs sur des fonctions
177
8.1 Paramétrage d'appel de fonctions177
8.2 Fonctions transmises en argument178
9 - Les expressions lambdas (C++11)
179
9.1 Exemple introductif179
9.2 La liste de capture d'une expression lambda180
9.2.1 Expressions lambdas nommées
181
9.2.2 Liste de capture
181
Chapitre 10 : La gestion dynamique183
1 - Les opérateurs new et delete pour les types scalaires
184
1.1 Présentation de new et delete184
1.2 Exemples185
1.2.1 Exemple 1
185
1.2.2 Exemple 2
186
1.2.3 Exemple 3
186
1.3 En cas de manque de mémoire187
2 - Les pointeurs intelligents (C++11)
187
3 - Le type unique(...)ptr (C++11)
188
3.1 Présentation générale188
3.2 Fiabilisation des schémas précédents188
3.2.1 Exemple 1
188
3.2.2 Exemple 2
189
3.3 Initialisation d'un unique(...)ptr189
3.3.1 Initialisation avec new
189
3.3.2 Initialisation avec make(...)unique
190
3.3.3 Récapitulatif
191
3.4 Propriétés des unique(...)ptr191
3.4.1 Adresse contenue dans un unique(...)ptr
191
3.4.2 Comparaisons
192
3.5 Transfert de propriété192
3.5.1 Par affectation avec move
192
3.5.2 Par appel de fonction
194
3.5.3 Cas particulier de la valeur de retour d'une fonction
195
4 - Le type shared(...)ptr (C++11)
197
4.1 Déclaration et initialisation197
4.2 Utilisation198
4.3 L'affectation et le compteur de références198
4.4 Exemple200
4.5 Transmission par valeur201
4.6 Conversion entre shared(...)ptr et unique(...)ptr202
5 - Quelques précautions (C++11)
203
6 - Pointeurs intelligents et cycles (C++11)
203
7 - Les suppresseurs (C++11)
204
8 - Le type auto(...)ptr
205
Chapitre 11 : Les vecteurs, les tableaux natifs et les chaînes C207
1 - Les vecteurs
208
1.1 Exemple de présentation des vecteurs208
1.2 Les éléments et les indices d'un vecteur209
1.2.1 Quelques règles
209
1.2.2 Absence de contrôle d'indice
210
1.3 Initialisation d'un vecteur211
1.4 Parcours d'un vecteur avec for pour les séquences212
1.5 Affectation de vecteurs213
1.6 Vecteurs transmis en argument d'une fonction214
1.6.1 Par défaut, la transmission se fait par valeur
214
1.6.2 Transmission d'un vecteur par référence ou par pointeur
215
1.7 Autres possibilités du type vector216
2 - Les tableaux natifs
216
2.1 Les tableaux natifs216
2.1.1 Exemple d'utilisation d'un tableau natif
216
2.1.2 Quelques règles
217
2.1.3 Parcours des éléments avec for pour les séquences (C++11))218
2.2 Les tableaux natifs à plusieurs indices219
2.2.1 Leur déclaration
219
2.2.2 Arrangement en mémoire des tableaux à plusieurs indices
219
2.2.3 Parcours des éléments d'un tableau à plusieurs indices (C++11)220
2.3 Initialisation des tableaux natifs220
2.3.1 Initialisation de tableaux natifs à un indice
220
2.3.2 Initialisation de tableaux natifs à plusieurs indices
221
2.3.3 Initialiseurs et classe d'allocation
222
2.4 L'équivalence entre tableau natif et pointeur222
2.4.1 Incrémentation de pointeurs
222
2.4.2 Comparaison et soustraction de pointeurs
223
2.4.3 Equivalence tableau à un indice et pointeur
223
2.5 Équivalence tableau à plusieurs indices et pointeur224
2.6 Transmission de tableaux natifs en argument226
2.6.1 Cas des tableaux à un indice
226
2.6.2 Cas des tableaux à plusieurs indices
228
2.7 Les tableaux dynamiques230
2.7.1 Avec des pointeurs natifs et les opérateurs new [] et delete []
230
2.7.2 Avec le type unique_ptr (C++11)231
2.7.3 Exemple
231
2.7.4 Initialisation de tableaux dynamiques
232
3 - Les vecteurs multidimensionnels
233
4 - Les chaînes de style C
234
4.1 Représentation des chaînes de style C234
4.2 Lecteure et écriture de chaînes de style C235
4.3 Initialisation de tableaux natifs par des chaînes de style C236
4.3.1 Initialisation de tableaux de caractères
236
4.3.2 Initialisation de tableaux natifs de pointeurs natifs sur des chaînes
237
4.4 Les arguments transmis à la fonction main238
4.5 Généralités sur les fonctions traitant des chaînes de style C239
4.5.1 Ces fonctions travaillent toujours sur les adresses
239
4.5.2 La fonction strlen
240
4.5.3 Le cas des fonctions de concaténation
240
4.6 Quelques précautions à prendre avec les chaînes de style C240
4.6.1 Une chaîne de style C possède une vraie fin, mais pas de vrai début
240
4.6.2 Les risques de modification des chaînes constantes
241
Chapitre 12 : Classes et objets243
1 - La notion de classe
244
1.1 Définition d'une classe point244
1.1.1 Déclaration de la classe point
244
1.1.2 Définition des fonctions membres de la classe
245
1.2 Utilisation de notre classe point246
1.3 Exemple récapitulatif247
1.4 La déclaration d'une classe d'une manière générale248
2 - Les structures
249
3 - Affectation d'objets
250
4 - Notions de constructeur et de destructeur
251
4.1 Introduction251
4.2 Exemple de classe comportant un constructeur252
4.3 Initialisation des membres dans l'en-tête du constructeur254
4.4 Construction et destruction des objets256
4.5 Rôles du constructeur et du destructeur257
4.6 Quelques règles258
5 - Objets transmis en argument d'une fonction
259
5.1 Cas de la transmission par valeur259
5.2 Cas de la transmission par référence260
5.3 Cas de la transmission par pointeur : l'opérateur ->261
6 - Les membres données statiques
262
6.1 Le qualificatif static pour un membre donnée262
6.2 Initialisation des membres données statiques263
6.3 Exemple264
7 - Exploitation d'une classe
265
7.1 La classe comme composant logiciel265
7.2 Protection contre les inclusions multiples267
7.3 Cas des membres données statiques267
7.4 Modification d'une classe268
7.4.1 Notion d'interface et d'implémentation
268
7.4.2 Modification d'une classe sans modification de son interface
268
7.4.3 Modification d'une classe avec modification de son interface
269
Chapitre 13 : Les propriétés des fonctions membres271
1 - Surdéfinition des fonctions membres
271
2 - Arguments par défaut
274
3 - Les fonctions membres en ligne
275
4 - Constructeurs délégués (C++11)
277
5 - Cas des objets transmis en argument d'une fonction membre
277
6 - Mode de transmission des objets en argument
279
6.1 Transmission de l'adresse d'un objet279
6.2 Transmission par référence281
6.3 Les problèmes posés par la transmission par valeur281
7 - Lorsqu'une fonction renvoie un objet
282
8 - Autoréférence : le mot-clé this
283
9 - Les fonctions membres statiques
284
10 - Fonctions membres et objets constants
286
10.1 Définition d'une fonction membre constante286
10.2 Propriétés d'une fonction membre constante287
11 - Les membres mutables
289
Chapitre 14 : Construction, destruction et initialisation des objets291
1 - Les objets automatiques et statiques
292
1.1 Durée de vie292
1.2 Appel des constructeurs et des destructeurs293
1.3 Exemple294
2 - Les objets dynamiques
295
2.1 Cas d'une classe sans constructeur296
2.2 Cas d'une classe avec constructeur297
2.2.1 Cas des pointeurs natifs
297
2.2.2 Avec les pointeurs intelligents (C++11)
298
2.2.3 Exemple
298
3 - Le constructeur de recopie
299
3.1 Il n'existe pas de constructeur approprié300
3.2 Il existe un constructeur approprié300
3.3 Comment interdire la construction par recopie300
4 - Exemple de constructeur de recopie
302
4.1 Comportement du constructeur de recopie par défaut302
4.1.1 Version pointeurs natifs
302
4.1.2 Version unique_ptr (C++11)
304
4.2 Définition d'un constructeur de recopie305
5 - Initialisation d'un objet lors de sa déclaration
308
5.1 Cas d'un constructeur à un seul argument308
5.2 Cas d'un constructeur à plusieurs arguments310
5.3 Le mot-clé default pour un constructeur (C++11)311
5.4 Cas particulier des classes agrégats311
5.5 Constructeur avec initializer_list (C++11)312
6 - Objets membres
314
6.1 Introduction314
6.2 Mise en oeuvre des constructeurs et des destructeurs315
6.3 Le constructeur de recopie317
7 - Les tableaux et vecteurs d'objets
318
7.1 Notations318
7.2 Constructeurs et initialiseurs319
7.3 Cas des tableaux dynamiques d'objets320
8 - Les objets temporaires
321
9 - Dissocier l'allocation mémoire de la construction
323
Chapitre 15 : Les fonctions amies325
1 - Exemple de fonction indépendante amie d'une classe
326
2 - Les différentes situations d'amitié
328
2.1 Fonction membre d'une classe, amie d'une autre classe329
2.2 Fonction amie de plusieurs classes330
2.3 Toutes les fonctions d'une classe amies d'une autre classe331
3 - Exemple
331
3.1 Fonction amie indépendante332
3.2 Fonction amie, membre d'une classe333
4 - Exploitation de classes disposant de fonctions amies
334
Chapitre 16 : La surdéfinition d'opérateurs335
1 - Le mécanisme de la surdéfinition d'opérateurs
336
1.1 Surdéfinition d'opérateur avec une fonction amie337
1.2 Surdéfinition d'opérateur avec une fonction membre338
1.3 Opérateurs et transmission par référence340
2 - La surdéfinition d'opérateurs en général
341
2.1 Se limiter aux opérateurs existants341
2.2 Se placer dans un contexte de classe343
2.3 Éviter les hypothèses sur le rôle d'un opérateur343
2.4 Cas des opérateurs ++ et --344
2.5 L'opérateur = possède une signification prédéfinie346
2.6 Les conversions346
2.7 Choix entre fonction membre et fonction amie347
3 - Surdéfinition de l'opérateur =
347
3.1 Rappels concernant le constructeur par recopie347
3.2 Cas de l'affectation par défaut348
3.3 Algorithme proposé350
3.4 Valeur de retour351
3.5 En définitive351
3.6 Exemple de programme complet352
3.7 Lorsqu'on souhaite interdire l'affectation354
4 - La forme canonique d'une classe
355
4.1 Cas général355
5 - Exemple de surdéfinition de l'opérateur []
356
6 - Surdéfinition de l'opérateur ()
359
7 - Surdéfinition des opérateurs new et delete
360
7.1 Surdéfinition de new et delete pour une classe donnée360
7.2 Exemple361
7.3 D'une manière générale363
Chapitre 17 : Les conversions de type définies par l'utilisateur365
1 - Les différentes sortes de conversions définies par l'utilisateur
366
2 - L'opérateur de cast pour la conversion type classe (...) type de base
368
2.1 Définition de l'opérateur de cast368
2.2 Exemple d'utilisation368
2.3 Appel implicite de l'opérateur de cast lors d'un appel de fonction370
2.4 Appel implicite de l'opérateur de cast dans l'évaluation d'une expression371
2.5 Conversions en chaîne373
2.6 En cas d'ambiguïté375
3 - Le constructeur pour la conversion type de base (...) type classe
375
3.1 Exemple375
3.2 Le constructeur dans une chaîne de conversions377
3.3 Choix entre constructeur ou opérateur d'affectation378
3.4 Emploi d'un constructeur pour élargir la signification d'un opérateur379
4 - Les conversions d'un type classe en un autre type classe
382
4.1 Exemple simple d'opérateur de cast382
4.2 Exemple de conversion par un constructeur383
4.3 Pour donner une signification à un opérateur défini dans une autre classe385
5 - Quelques conseils
387
Chapitre 18 : Les patrons de fonctions389
1 - Exemple de création et d'utilisation d'un patron de fonctions
390
1.1 Création d'un patron de fonctions390
1.2 Premières utilisations du patron de fonctions391
1.3 Autres utilisations du patron de fonctions392
1.3.1 Application au type char*
392
1.3.2 Application à un type classe
393
1.4 Contraintes d'utilisation d'un patron394
2 - Les paramètres de type d'un patron de fonctions
395
2.1 Utilisation des paramètres de type dans la définition d'un patron395
2.2 Identification des paramètres de type d'une fonction patron396
2.3 Retour sur la syntaxe d'initialisation des variables397
2.4 Limitations des patrons de fonctions398
2.5 Le type initializer_list et les patrons de fonctions (C++11)399
2.6 Paramètres de type par défaut (C++11)399
3 - Les paramètres expressions d'un patron de fonctions
400
4 - Surdéfinition de patrons
401
4.1 Exemples ne comportant que des paramètres de type401
4.2 Exemples comportant des paramètres expressions404
5 - Spécialisation de fonctions de patron
405
5.1 Généralités405
5.2 Les spécialisations partielles406
6 - Algorithme d'instanciation d'une fonction patron
406
7 - Patrons de fonctions à nombre variable de paramètres (C++11)
408
Chapitre 19 : Les patrons de classes411
1 - Exemple de création et d'utilisation d'un patron de classes
412
1.1 Création d'un patron de classes412
1.2 Utilisation d'un patron de classes414
1.3 Contraintes d'utilisation d'un patron de classes414
1.4 Exemple récapitulatif415
2 - Les paramètres de type d'un patron de classes
417
2.1 Les paramètres de type dans la création d'un patron de classes417
2.2 Instanciation d'une classe patron417
3 - Les paramètres expressions d'un patron de classes
418
3.1 Exemple418
3.2 Les propriétés des paramètres expressions420
4 - Spécialisation d'un patron de classes
421
4.1 Exemple de spécialisation d'une fonction membre421
4.2 Les différentes possibilités de spécialisation422
4.2.1 On peut spécialiser une fonction membre pour tous les paramètres
422
4.2.2 On peut spécialiser une fonction membre ou une classe
423
4.2.3 On peut prévoir des spécialisations partielles de patrons de classes
423
5 - Paramètres par défaut
423
6 - Patrons de fonctions membres
424
7 - Identité de classes patrons
424
8 - Classes patrons et déclarations d'amitié
425
8.1 Déclaration de classes ou fonctions « ordinaires » amies425
8.2 Déclaration d'instances particulières de classes patrons ou de fonctions patrons426
8.3 Déclaration d'un autre patron de fonctions ou de classes426
8.4 Déclaration d'amitié d'un paramètre de type (C++11)427
9 - Compilation conditionnelle avec if constepr (C++17)
427
10 - Patrons de classes à paramètres variables (C++11)
428
Chapitre 20 : L'héritage simple429
1 - La notion d'héritage
430
2 - Utilisation des membres de la classe de base dans une classe dérivée
432
3 - Redéfinition des membres d'une classe dérivée
435
3.1 Redéfinition des fonctions membres d'une classe dérivée435
3.2 Redéfinition des membres données d'une classe dérivée436
3.3 Redéfinition et surdéfinition437
4 - Appel des constructeurs et des destructeurs
439
4.1 Rappels439
4.2 La hiérarchisation des appels439
4.3 Transmission d'informations entre constructeurs440
4.4 Exemple441
4.5 Compléments442
5 - Contrôle des accès
443
5.1 Les membres protégés443
5.2 Exemple444
5.3 Intérêt du statut protégé445
5.4 Dérivation publique et dérivation privée445
5.4.1 Rappels concernant la dérivation publique
445
5.4.2 Dérivation privée
446
5.4.3 Les possibilités de dérivation protégée
447
5.5 Récapitulation448
6 - Compatibilité entre classe de base et classe dérivée
449
6.1 Conversion implicite de pointeurs natifs et typage statique450
6.2 Conversions de références453
6.3 Cas de pointeurs intelligents454
6.4 Conversion entre objet et objet dérivé454
6.5 Les risques de violation des protections de la classe de base455
7 - Le constructeur de recopie et l'héritage
455
7.1 La classe dérivée ne définit pas de constructeur de recopie456
7.2 La classe dérivée définit un constructeur de recopie457
8 - L'opérateur d'affectation et l'héritage
458
8.1 La classe dérivée ne surdéfinit pas l'opérateur=459
8.2 La classe dérivée surdéfinit l'opérateur=459
9 - Héritage et formes canoniques d'une classe
462
10 - L'héritage et ses limites
463
10.1 La situation d'héritage464
10.1.1 Le type du résultat de l'appel
464
10.1.2 Le type des arguments de f
464
10.2 Exemples465
10.2.1 Héritage dans pointcol d'un opérateur + défini dans point465
10.2.2 Héritage dans pointcol de la fonction coincide de point
466
11 - Patrons de classes et héritage
467
11.1 Classe « ordinaire » dérivant d'une classe patron467
11.2 Dérivation de patrons avec les mêmes paramètres468
11.3 Dérivation de patrons avec introduction d'un nouveau paramètre469
12 - L'héritage en pratique
470
12.1 Dérivations successives470
12.2 Différentes utilisations de l'héritage472
12.3 Exploitation d'une classe dérivée472
Chapitre 21 : L'héritage multiple475
1 - Mise en oeuvre de l'héritage multiple
476
2 - Pour régler les éventuels conflits : les classes virtuelles
480
3 - Appels des constructeurs et des destructeurs : cas des classes virtuelles
481
4 - Exemple d'utilisation de l'héritage multiple et de la dérivation virtuelle
484
Chapitre 22 : Les fonctions virtuelles et le polymorphisme487
1 - Rappel d'une situation où le typage dynamique est nécessaire
488
2 - Le mécanisme des fonctions virtuelles
488
3 - Autre situation où la ligature dynamique est indispensable
490
4 - Polymorphisme, pointeurs et références
493
4.1 Polymorphisme et pointeurs intelligent493
4.2 Polymorphisme et références494
5 - Les propriétés des fonctions virtuelles
495
5.1 Leurs limitations sont celles de l'héritage495
5.2 La redéfinition d'une fonction virtuelle n'est pas obligatoire496
5.3 Fonctions virtuelles et surdéfinition497
5.3.1 Généralités
497
5.3.2 Contrôle des surdéfinitions de fonctions virtuelles (C++11) : override
497
5.3.3 Interdiction de redéfinition d'une fonction virtuelle (C++11) : final
497
5.4 Le type de retour d'une fonction virtuelle redéfinie498
5.5 On peut déclarer une fonction virtuelle dans n'importe quelle classe499
5.6 Quelques restrictions et conseils499
5.6.1 Seule une fonction membre peut être virtuelle
499
5.6.2 Un constructeur ne peut pas être virtuel
500
5.6.3 Un destructeur peut être virtuel
500
5.6.4 Cas particulier de l'opérateur d'affectation
501
6 - Les fonctions virtuelles pures pour la création de classes abstraites
502
7 - Exemple d'utilisation de fonctions virtuelles : liste hétérogène
504
8 - Table des fonctions virtuelles
508
9 - Identification de type à l'exécution
510
9.1 Utilisation du champ name type_info510
9.2 Utilisation des opérateurs de comparaison de type_info512
9.3 Exemple avec des références513
10 - Les cast dynamiques
513
Chapitre 23 : Optimisation par déplacement (C++11)517
1 - La référence à une rvalue
518
1.1 Généralités518
1.2 Nouvelles règles de surdéfinition519
1.3 Conversion d'une Ivalue en une rvalue : fonction move521
1.4 Exemple522
2 - Application à la construction et à l'affectation
522
3 - Exemple d'écriture d'opérations de déplacement
524
3.1 Le constructeur de déplacement524
3.2 L'opérateur d'affectation par déplacent526
3.3 Exemple complet527
4 - Utilisation du déplacement par défaut
529
5 - Sémantique de déplacement et héritage
530
6 - Références rvalue et patrons de fonctions
531
6.1 Référence « universelle » dans un patron de fonctions531
6.2 Référence universelle et surdéfinition532
6.3 Quand && dans un patron ne désigne plus une référence universelle532
6.4 La fonction forward533
6.5 En cas de spécialisation de patrons535
7 - Retour sur le type unique_ptr
536
Chapitre 24 : Les flots537
1 - Présentation générale de la classe ostream
539
1.1 L'opérateur <<539
1.2 Les flots prédéfinis540
1.3 Quelques possibilités de formatage avec <<540
1.3.1 Action sur la base de numération
541
1.3.2 Action sur le gabarit de l'information écrite
542
1.3.3 Action sur la précision de l'information écrite
543
1.3.4 Choix entre notation flottante ou exponentielle
544
1.3.5 Un programme de facturation amélioré
545
1.4 Les opérations non formatées de la classe ostream546
1.5 La fonction put546
1.6 La fonction write547
2 - Présentation générale de la classe istream
547
2.1 L'opérateur >>547
2.1.1 Les types acceptés par >>
548
2.2 Les fonctions membres de la classe istream548
2.3 La fonction get549
2.4 La fonction read550
2.4.1 Cas des caractères
550
2.4.2 Autres cas
550
2.5 Les fonctions getline et gcount550
2.6 Quelques autres fonctions552
3 - Statut d'erreur d'un flot
552
3.1 Les bits d'erreur552
3.2 Actions concernant les bits d'erreur553
3.2.1 Accès aux bits d'erreur
553
3.2.2 Modification du statut d'erreur
553
3.3 Surdéfinition des opérateurs () et !554
3.4 Exemples554
4 - Surdéfinition de << et >> pour les types définis par l'utilisateur
556
4.1 Méthode556
4.2 Exemple558
5 - Gestion du formatage
560
5.1 Le statut de formatage d'un flot560
5.2 Description du mot d'état du statut de formatage561
5.3 Action sur le statut de formatage562
5.3.1 Les manipulateurs non paramétriques
562
5.3.2 Les manipulateurs paramétriques
563
5.3.3 Les fonctions membres
564
5.3.4 Exemple
566
6 - Connexion d'un flot à un fichier
566
6.1 Connexion d'un flot de sortie à un fichier567
6.2 Connexion d'un flot d'entrée à un fichier568
6.3 Les possibilités d'accès direct569
6.4 Les différents modes d'ouverture d'un fichier571
7 - Les anciennes possibilités de formatage en mémoire
572
7.1 La classe ostrstream573
7.2 La classe istrstream574
Chapitre 25 : La gestion des exceptions577
1 - Premier exemple d'exception
578
1.1 Comment lancer une exception : l'instruction throw579
1.2 Utilisation d'un gestionnaire d'exception579
1.3 Récapitulatif580
2 - Second exemple
582
3 - Le mécanisme de gestion des exceptions
584
3.1 Poursuite de l'exécution du programme584
3.2 Prise en compte des sorties de blocs586
4 - Choix du gestionnaire
586
4.1 Le gestionnaire reçoit toujours une copie587
4.2 Règles de choix d'un gestionnaire d'exception587
4.3 Le cheminement des exceptions588
4.4 Redéclenchement d'une exception590
5 - Spécification des exceptions
591
5.1 Spécification d'avant C++11591
5.2 Spécification avec C++11592
5.3 Exemples592
6 - Les exceptions standards
594
6.1 Généralités594
6.2 Les exceptions déclenchées par la bibliothèque standard595
6.3 Les exceptions utilisables dans un programme595
6.4 Cas particulier de la gestion dynamique de mémoire596
6.4.1 L'exception bad_alloc
596
6.4.2 L'opérateur new (nothrow)
597
6.4.3 Utilisation de set_new_handler
598
6.5 Création d'exceptions dérivées de la classe exception599
6.5.1 Exemple 1
599
6.5.2 Exemple 2
600
7 - Exceptions et gestion de ressources
601
7.1 Les problèmes posés par les objets dynamiques601
7.2 Une solution utilisant les pointeurs intelligents (C++11)603
7.3 La technique de gestion de ressources par initialisation603
Chapitre 26 : Généralités sur la bibliothèque standard605
1 - Notions de conteneur, d'itérateur et d'algorithme
605
1.1 Notion de conteneur606
1.2 Notion d'itérateur606
1.3 Parcours d'un conteneur avec un itérateur607
1.3.1 Parcours direct
607
1.3.2 Parcours inverse
608
1.3.3 Itérateurs constants : const_iterator et const_reserve_iterator
608
1.3.4 La déclaration auto et les itérateurs (C++11)
608
1.4 Intervalle d'itérateur609
1.5 Notion d'algorithme609
1.6 Itérateurs et pointeurs610
2 - Les différentes sortes de conteneurs
611
2.1 Conteneurs et structures de données classiques611
2.2 Les différentes catégories de conteneurs611
3 - Les conteneurs dont les éléments sont des objets
612
3.1 Construction, copie et affectation612
3.2 Autres opérations614
4 - Efficacité des opérations sur des conteneurs
614
5 - Fonctions, prédicats et classes fonctions
615
5.1 Fonction unaire615
5.2 Prédicats615
5.3 Classes et objets fonctions616
5.3.1 Utilisation d'objet fonction comme fonction de rappel
616
5.3.2 Classes fonctions prédéfinies
617
5.3.3 La classe function (C++11)
618
6 - Conteneurs, algorithmes et relations d'ordre
619
6.1 Introduction619
6.2 Propriétés à respecter620
Chapitre 27 : Les conteneurs séquentiels621
1 - Fonctionnalités communes aux conteneurs vector, list et deque
622
1.1 Construction622
1.1.1 Construction d'un conteneur vide
622
1.1.2 Construction avec un nombre donné d'éléments
622
1.1.3 Construction avec un nombre donné d'éléments de valeur donnée
623
1.1.4 Construction à partir d'une séquence
623
1.1.5 Construction à partir d'un autre conteneur de même type
624
1.1.6 Construction à partir d'une liste de valeurs (C++11)
624
1.2 Modifications globales624
1.2.1 Opérateur d'affectation
625
1.2.2 La fonction membre assign
625
1.2.3 La fonction clear
626
1.2.4 La fonction swap
626
1.3 Comparaison de conteneurs626
1.3.1 L'opérateur ==
626
1.3.2 L'opérateur <
627
1.3.3 Exemples avec un vector <int>
627
1.3.4 Exemple avec un vector <point>
627
1.4 Insertion ou suppression d'éléments629
1.4.1 Insertion
629
1.4.2 Suppression
630
1.4.3 Cas des insertions/suppressions en fin : pop_back et push_back
630
2 - Le conteneur vector
631
2.1 Accès aux éléments existants631
2.1.1 Accès par itérateur
631
2.1.2 Accès par indice
632
2.1.3 Cas de l'accès au dernier élément
632
2.2 Insertions et suppressions632
2.3 Gestion de l'emplacement mémoire633
2.3.1 Introduction
633
2.3.2 Invalidation d'itérateurs ou de références
633
2.3.3 Outils de gestion de l'emplacement mémoire d'un vecteur
633
2.4 Exemple634
2.5 Cas particulier des vecteurs de booléens636
3 - Le conteneur deque
636
3.1 Présentation générale636
3.2 Exemple637
4 - Le conteneur list
638
4.1 Accès aux éléments existants638
4.2 Insertions et suppressions639
4.2.1 Suppression des éléments de valeur donnée
639
4.2.2 Suppression des éléments répondant à une condition
639
4.3 Opérations globales640
4.3.1 Tri d'une liste
640
4.3.2 Suppression des éléments en double
640
4.3.3 Fusion de deux listes
641
4.3.4 Transfert d'une partie de liste dans une autre
642
4.4 Gestion de l'emplacement mémoire642
4.5 Exemple643
5 - Les adaptateurs de conteneur : queue, stack et priority_queue
644
5.1 L'adaptateur stack644
5.2 L'adaptateur queue645
5.3 L'adaptateur priority_queue646
6 - Le type array (C++11)
647
Chapitre 28 : Les conteneurs associatifs649
1 - Le conteneur map
650
1.1 Exemple introductif650
1.2 Le patron de classes pair652
1.3 Construction d'un conteneur de type map653
1.3.1 Constructions utilisant la relation d'ordre par défaut
653
1.3.2 Choix de l'ordre intrinsèque du conteneur
654
1.3.3 Pour connaître la relation d'ordre utilisée par un conteneur
654
1.3.4 Conséquences du choix de l'ordre d'un conteneur
655
1.4 Accès aux éléments656
1.4.1 Accès par l'opérateur []
656
1.4.2 Accès par itérateur
656
1.4.3 Recherche par la fonction membre find
657
1.5 Insertions et suppressions657
1.5.1 Insertions
657
1.5.2 Suppressions
658
1.6 Gestion mémoire659
1.7 Autres possibilités659
1.8 Exemple660
2 - Le conteneur multimap
661
2.1 Présentation générale661
2.2 Exemple662
3 - Le conteneur set
664
3.1 Présentation générale664
3.2 Exemple664
3.3 Le conteneur set et l'ensemble mathématique665
4 - Le conteneur multiset
665
5 - Le type tuple (C++11)
667
6 - Les tables de hachage (C++11)
667
7 - Conteneurs associatifs et algorithmes
667
Chapitre 29 : Les algorithmes standards669
1 - Notions générales
669
1.1 Algorithmes et itérateurs669
1.2 Les catégories d'itérateurs670
1.2.1 Itérateur en entrée
670
1.2.2 Itérateur en sortie
670
1.2.3 Hiérarchie des catégories d'itérateurs
671
1.3 Algorithmes et séquences671
1.4 Itérateur d'insertion672
1.5 Itérateur de flot674
1.5.1 Intérateur de flot de sortie
674
1.5.2 Itérateur de flot d'entrée
675
2 - Algorithmes d'initialisation de séquences existantes
675
2.1 Copie d'une séquence dans une autre676
2.2 Génération de valeurs par une fonction677
3 - Algorithmes de recherche
679
3.1 Algorithmes fondés sur une égalité ou un prédicat unaire679
3.2 Algorithmes de recherche de maximum ou de minimum681
4 - Algorithmes de transformation d'une séquence
682
4.1 Remplacement de valeurs682
4.2 Permutations de valeurs682
4.2.1 Rotation
682
4.2.2 Génération de permutations
683
4.2.3 Permutations aléatoires
685
4.3 Partitions686
5 - Algorithmes dits « de suppression »
686
6 - Algorithmes de tri
688
7 - Algorithmes de recherche et de fusion sur des séquences ordonnées
689
7.1 Algorithmes de recherche binaire690
7.2 Algorithmes de fusion690
8 - Algorithmes à caractère numérique
691
9 - Algorithmes à caractère ensembliste
693
10 - Algorithmes de manipulation de tas
694
Chapitre 30 : La classe string699
1 - Généralités
700
2 - Construction
700
3 - Opérations globales
702
4 - Concaténation
703
5 - Recherche dans une chaîne
704
5.1 Recherche d'une chaîne ou d'un caractère704
5.2 Recherche d'un caractère présent ou absent d'une suite705
6 - Insertions, suppressions et remplacements
705
6.1 Insertions705
6.2 Suppressions706
6.3 Remplacements707
7 - Les possibilités de formatage en mémoire
708
7.1 La classe ostringstream708
7.2 La classe istringstream709
7.2.1 Présentation
709
7.2.2 Utilisation pour fiabiliser les lectures au clavier
710
Chapitre 31 : Les outils numériques713
1 - La classe complex
713
2 - La classe valarray et les classes associées
715
2.1 Constructeurs des classes valarray715
2.2 L'opérateur []716
2.3 Affectation et changement de taille716
2.4 Calcul vectoriel717
2.5 Sélection de valeurs par masque718
2.6 Sections de vecteurs719
2.7 Vecteurs d'indices721
3 - La classe bitset
725
Chapitre 32 : Les espaces de noms725
1 - Création d'espaces de noms
725
1.1 Exemple de création d'un nouvel espace de noms726
1.2 Exemple avec deux espaCes de noms727
1.3 Espaces de noms et fichier en-tête728
1.4 Instructions figurant dans un espace de noms728
1.5 Création incrémentale d'espaces de noms729
2 - Les instructions using
730
2.1 La déclaration using pour les symboles730
2.1.1 Présentation générale
730
2.1.2 Masquage et ambiguïtés
732
2.2 La directive using pour les espaces de noms733
3 - Espaces de noms et recherche de fonctions
735
4 - Imbrication des espaces de noms
737
5 - Transitivité de la directive using
738
6 - Les alias
738
7 - Les espaces anonymes
739
8 - Espaces de noms et déclarations d'amitié
739
Chapitre 33 : Le préprocesseur et les instructions typedef et using741
1 - La directive #include
742
2 - La directive #define
742
2.1 Définition de symboles742
2.2 Définition de macros744
3 - La compilation conditionnelle
747
3.1 Incorporation liée à l'existence de symboles747
3.2 Incorporation liée à la valeur d'une expression748
3.3 Compilation conditionnelle avec if constepr (C++17)749
4 - La définition de synonymes avec typedef
750
4.1 Définition d'un synonyme de int751
4.2 Définition d'un synonyme de int*751
4.3 Définition d'un synonyme de int[3]752
4.4 Synonymes et patrons753
4.5 Synonymes et fonctions754
5 - Définition de synonymes de types avec using (C++11)
754
Chapitre 34 : Énumérations, champs de bits et unions755
1 - Les énumérations
755
1.1 Exemples introductifs756
1.1.1 C++98
756
1.1.2 C++11
756
1.2 Propriétés du type énumération757
2 - Les champs de bits
758
3 - Les unions
759
Chapitre 35 : Introduction aux threads (C++11)761
1 - Thread depuis une fonction ou un objet fonction
762
1.1 Généralités762
1.2 Transmission d'arguments à un thread763
1.3 Mise en sommeil d'un thread764
2 - Thread depuis une fonction membre
765
3 - Threads et exceptions
765
4 - Partage de données entre threads et verrous mutex
767
5 - Prise en compte des exceptions avec verrou lock_guard
769
6 - Les variables atomic
770
7 - Transfert d'informations en retour d'un thread
771
7.1 Utilisation de la fonction async771
7.2 Démarche plus générale771
Annexe A : Règles de recherche d'une fonction surdéfinie775
1 - Détermination des fonctions candidates
775
2 - Algorithme de recherche d'une fonction à un seul argument
776
2.1 Recherche d'une correspondance exacte776
2.2 Promotions numériques777
2.3 Conversions standards777
2.4 Conversions définies par l'utilisateur778
2.5 Fonctions à arguments variables778
2.6 Exception : cas des champs de bits778
3 - Fonctions à plusieurs arguments
779
4 - Fonctions membres
779
Annexe B : Les différentes sortes de fonction en C++781
Annexe C : Les pointeurs sur des membres783
1 - Les pointeurs sur des fonctions membres
783
2 - Les pointeurs sur des membres données
784
3 - L'héritage et les pointeurs sur des membres
785
Annexe D : Les algorithmes standards787
1 - Algorithmes d'initialisation de séquences existantes
788
2 - Algorithmes de recherche
789
3 - Algorithmes de transformation d'une séquence
793
4 - Algorithmes des suppression
796
5 - Algorithmes de tri
797
6 - Algorithmes de recherche et de fusion sur des séquences ordonnées
799
7 - Algorithmes à caractère numérique
801
8 - Algorithmes à caractère ensembliste
803
9 - Algorithmes de manipulation de tas
805
10 - Algorithmes divers
806
Annexe E : Les incompatibilités entre C et C++809
1 - Emplacement des déclarations
809
2 - Prototypes
809
3 - Fonctions sans arguments
809
4 - Fonctions sans valeur de retour
810
5 - Le qualificatif const
810
6 - Les pointeurs de type void*
810
7 - Mots-clés
810
8 - Les constantes de type caractère
811
9 - Les définitions multiples
811
10 - L'instruction goto
812
11 - Les énumérations
812
12 - Initialisation de tableaux de caractères
812
13 - Les noms de fonctions
813
14 - Tableaux de dimension variable
813
Annexe F : C++20815
1 - Les concepts et les contraintes
815
1.1 Premier exemple de concept et de contrainte816
1.2 Utilisation de plusieurs contraintes818
1.3 Exemple d'application à un patron de classes819
1.4 La bibliothèque type-traits819
1.5 D'une manière générale821
1.5.1 Les différentes sortes de contraintes
821
1.5.2 Les différentes façons d'utiliser les contraintes
821
1.5.3 Concepts variables et concepts fonctions
823
1.6 Concepts standards823
2 - Les modules
824
2.1 Premier exemple de module824
2.2 Séparation interface et définition825
2.3 Partitions de modules826
2.3.1 Premier exemple
826
2.3.2 Second exemple
827
2.4 Types de modules827
2.5 Eléments de compatibilité avec les versions antérieures827
3 - Les coroutines
828
4 - Choses diverses
828
Index831