Cours de C/C++

Christian Casteyde

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License".

Permission vous est donnée de copier, distribuer et modifier ce document selon les termes de la licence GNU pour les documentations libres, version 1.1 ou toute autre version ultérieure publiée par la Free Software Foundation.

Une copie de cette licence est incluse dans l'annexe intitulée "GNU Free Documentation License". Vous trouverez également une traduction non officielle de cette licence dans l'annexe intitulée "Licence de documentation libre GNU".


Table des matières
Avant-propos
I. Le langage C++
1. Première approche du C/C++
1.1. Les commentaires en C++
1.2. Les types prédéfinis du C/C++
1.3. Notation des valeurs
1.4. La définition des variables
1.5. Instructions et opérations
1.6. Les fonctions
1.7. La fonction main
1.8. Les fonctions d'entrée / sortie de base
1.9. Exemple de programme complet
2. Les structures de contrôle
2.1. La structure conditionnelle if
2.2. La boucle for
2.3. Le while
2.4. Le do
2.5. Le branchement conditionnel
2.6. Le saut
2.7. Les commandes de rupture de séquence
3. Types avancés et classes de stockage
3.1. Structures de données et types complexes
3.2. Les classes de stockage
4. Les pointeurs et références
4.1. Notion d'adresse
4.2. Notion de pointeur
4.3. Déréférencement, indirection
4.4. Notion de référence
4.5. Lien entre les pointeurs et les références
4.6. Passage de paramètres par variable ou par valeur
4.7. Références et pointeurs constants et volatiles
4.8. Arithmétique des pointeurs
4.9. Utilisation des pointeurs avec les tableaux
4.10. Les chaînes de caractères : pointeurs et tableaux à la fois !
4.11. Allocation dynamique de mémoire
4.12. Pointeurs et références de fonctions
4.13. Paramètres de la fonction main - ligne de commande
4.14. DANGER
5. Le préprocesseur C
5.1. Définition
5.2. Les commandes du préprocesseur
5.3. Les macros
5.4. Manipulation de chaînes de caractères dans les macros
5.5. Les trigraphes
6. Modularité des programmes et génération des binaires
6.1. Pourquoi faire une programmation modulaire ?
6.2. Les différentes phases du processus de génération des exécutables
6.3. Compilation séparée en C/C++
6.4. Syntaxe des outils de compilation
6.5. Problèmes syntaxiques relatifs à la compilation séparée
7. Comment faire du code illisible ?
8. C++ : la couche objet
8.1. Généralités
8.2. Extension de la notion de type du C
8.3. Déclaration de classes en C++
8.4. Encapsulation des données
8.5. Héritage
8.6. Classes virtuelles
8.7. Fonctions et classes amies
8.8. Constructeurs et destructeurs
8.9. Pointeur this
8.10. Données et fonctions membres statiques
8.11. Surcharge des opérateurs
8.12. Des entrées - sorties simplifiées
8.13. Méthodes virtuelles
8.14. Dérivation
8.15. Méthodes virtuelles pures - Classes abstraites
8.16. Pointeurs sur les membres d'une classe
9. Les exceptions en C++
9.1. Lancement et récupération d'une exception
9.2. Remontée des exceptions
9.3. Liste des exceptions autorisées pour une fonction
9.4. Hiérarchie des exceptions
9.5. Exceptions dans les constructeurs
10. Identification dynamique des types
10.1. Identification dynamique des types
10.2. Transtypages C++
11. Les espaces de nommage
11.1. Définition des espaces de nommage
11.2. Déclaration using
11.3. Directive using
12. Les template
12.1. Généralités
12.2. Déclaration des paramètres template
12.3. Fonctions et classes template
12.4. Instanciation des template
12.5. Spécialisation des template
12.6. Mot-clé typename
12.7. Fonctions exportées
II. La bibliothèque standard C++
13. Services et notions de base de la bibliothèque standard
13.1. Encapsulation de la bibliothèque C standard
13.2. Définition des exceptions standards
13.3. Abstraction des types de données : les traits
13.4. Abstraction des pointeurs : les itérateurs
13.5. Abstraction des fonctions : les foncteurs
13.6. Gestion personnalisée de la mémoire : les allocateurs
13.7. Notion de complexité algorithmique
14. Les types complémentaires
14.1. Les chaînes de caractères
14.2. Les types utilitaires
14.3. Les types numériques
15. Les flux d'entrée / sortie
15.1. Notions de base et présentation générale
15.2. Les tampons
15.3. Les classes de base des flux : ios_base et basic_ios
15.4. Les flux d'entrée / sortie
15.5. Les flux d'entrée / sortie sur chaînes de caractères
15.6. Les flux d'entrée / sortie sur fichiers
16. Les locales
16.1. Notions de base et principe de fonctionnement des facettes
16.2. Les facettes standards
16.3. Personnalisation des mécanismes de localisation
17. Les conteneurs
17.1. Fonctionnalités générales des conteneurs
17.2. Les séquences
17.3. Les conteneurs associatifs
18. Les algorithmes
18.1. Opérations générales de manipulation des données
18.2. Opérations de recherche
18.3. Opérations d'ordonnancement
18.4. Opérations de comparaison
18.5. Opérations ensemblistes
19. Conclusion
A. Priorités des opérateurs
B. Draft Papers
C. GNU Free Documentation License
D. Licence de documentation libre GNU
BIBLIOGRAPHIE
Liste des tableaux
1-1. Types pour les chaînes de format de printf
1-2. Options pour les types des chaînes de format
2-1. Opérateurs de comparaison
2-2. Opérateurs logiques
5-1. Trigraphes
8-1. Droits d'accès sur les membres hérités
14-1. Fonctions de recherche dans les chaînes de caractères
14-2. Fonctions spécifiques aux complexes
15-1. Options de formatage des flux
15-2. Modes d'ouverture des fichiers
15-3. Directions de déplacement dans un fichier
15-4. États des flux d'entrée / sortie
15-5. Manipulateurs des flux de sortie
15-6. Manipulateurs utilisant des paramètres
15-7. Manipulateurs des flux d'entrée
16-1. Fonctions C de gestion des dates
17-1. Méthodes spécifiques aux listes
A-1. Opérateurs du langage
Liste des illustrations
4-1. Notion de pointeur et d'adresse
6-1. Processus de génération des binaires
Liste des exemples
1-1. Commentaire C
1-2. Commentaire C++
1-3. Types signés et non signés
1-4. Notation des entiers en base 10
1-5. Notation des entiers en base 16
1-6. Notation des entiers en base 8
1-7. Notation des réels
1-8. Définition de variables
1-9. Définition d'un tableau
1-10. Instruction vide
1-11. Affectation composée
1-12. Instruction composée
1-13. Définition de fonction
1-14. Définition de procédure
1-15. Appel de fonction
1-16. Déclaration de fonction
1-17. Surcharge de fonctions
1-18. Fonction inline
1-19. Fonction statique
1-20. Fonction à nombre de paramètres variable
1-21. Programme minimal
1-22. Utilisation de printf et fprintf
1-23. Programme complet simple
2-1. Test conditionnel if
2-2. Boucle for
2-3. Boucle while
2-4. Boucle do
2-5. Branchement conditionnel switch
2-6. Rupture de séquence par continue
3-1. Déclaration de variable de type structure
3-2. Déclaration de structure
3-3. Déclaration d'une union
3-4. Union avec discriminant
3-5. Déclaration d'une énumération
3-6. Déclaration d'un champs de bits
3-7. Initialisation d'une structure
3-8. Initialisation de structure C99
3-9. Définition de type simple
3-10. Définition de type tableau
3-11. Définition de type structure
3-12. Transtypage en C
3-13. Déclaration d'une variable locale statique
3-14. Déclaration d'une variable constante
3-15. Déclaration de constante externes
3-16. Utilisation du mot clé mutable
4-1. Déclaration de pointeurs
4-2. Utilisation de pointeurs de structures
4-3. Déclaration de références
4-4. Passage de paramètre par valeur
4-5. Passage de paramètre par variable en Pascal
4-6. Passage de paramètre par variable en C
4-7. Passage de paramètre par référence en C++
4-8. Passage de paramètres constant par référence
4-9. Création d'un objet temporaire lors d'un passage par référence
4-10. Arithmétique des pointeurs
4-11. Accès aux éléments d'un tableau par pointeurs
4-12. Passage de tableau en paramètre
4-13. Allocation dynamique de mémoire en C
4-14. Déclaration de pointeur de fonction
4-15. Déréférencement de pointeur de fonction
4-16. Application des pointeurs de fonctions
4-17. Récupération de la ligne de commande
5-1. Définition de constantes de compilation
5-2. Macros MIN et MAX
6-1. Compilation d'un fichier et édition de liens
6-2. Fichier makefile sans dépendances
6-3. Fichier makefile avec dépendances
6-4. Déclarations utilisables en C et en C++
7-1. Programme parfaitement illisible
8-1. Déclaration de méthodes de classe
8-2. Opérateur de résolution de portée
8-3. Utilisation des champs d'une classe dans une de ses méthodes
8-4. Utilisation du mot clé class
8-5. Héritage public, privé et protégé
8-6. Opérateur de résolution de portée et membre de classes de base
8-7. Classes virtuelles
8-8. Fonctions amies
8-9. Classe amie
8-10. Constructeurs et destructeurs
8-11. Appel du constructeur des classes de base
8-12. Initialisation de données membres constantes
8-13. Donnée membre statique
8-14. Fonction membre statique
8-15. Appel de fonction membre statique
8-16. Surcharge des opérateurs internes
8-17. Surcharge d'opérateurs externes
8-18. Opérateurs d'incrémentation et de décrémentation
8-19. Implémentation d'une classe matrice
8-20. Opérateur de déréférencement et d'indirection
8-21. Détermination de la taille de l'en-tête des tableaux
8-22. Opérateurs new avec placement
8-23. Utilisation de new sans exception
8-24. Flux d'entrée / sortie cin et cout
8-25. Redéfinition de méthode de classe de base
8-26. Conteneur d'objets polymorphiques
8-27. Pointeurs sur membres statiques
9-1. Utilisation des exceptions
9-2. Installation d'un gestionnaire d'exception avec set_terminate
9-3. Gestion de la liste des exceptions autorisées
9-4. Classification des exceptions
9-5. Exceptions dans les constructeurs
10-1. Opérateur typeid
10-2. Opérateur dynamic_cast
11-1. Extension de namespace
11-2. Accès aux membres d'un namespace
11-3. Définition externe d'une fonction de namespace
11-4. Définition de namespace dans un namespace
11-5. Définition de namespace anonyme
11-6. Ambiguïtés entre namespaces
11-7. Déclaration using
11-8. Déclarations using multiples
11-9. Extension de namespace après une déclaration using
11-10. Conflit entre déclarations using et identificateurs locaux
11-11. Déclaration using dans une classe
11-12. Rétablissement de droits d'accès à l'aide d'une directive using
11-13. Directive using
11-14. Extension de namespace après une directive using
11-15. Conflit entre directive using et identificateurs locaux
12-1. Déclaration de paramètres template
12-2. Déclaration de paramètre template template
12-3. Déclaration de paramètres template de type constante
12-4. Définition de fonction template
12-5. Définition d'une pile template
12-6. Fonction membre template
12-7. Fonction membre template d'une classe template
12-8. Fonction membre template et fonction membre virtuelle
12-9. Surcharge de fonction membre par une fonction membre template
12-10. Instanciation implicite de fonction template
12-11. Instanciation explicite de classe template
12-12. Spécialisation totale
12-13. Spécialisation partielle
12-14. Spécialisation de fonction membre de classe template
12-15. Mot-clé typename
12-16. Mot-clé export
13-1. Détermination des limites d'un type
13-2. Itérateurs de flux d'entrée
13-3. Itérateur de flux de sortie
13-4. Itérateur d'insertion
13-5. Utilisation d'un itérateur inverse
13-6. Utilisation des foncteurs prédéfinis
13-7. Adaptateurs de fonctions
13-8. Réduction de foncteurs binaires
13-9. Utilisation de l'allocateur standard
14-1. Redimensionnement d'une chaîne
14-2. Réservation de mémoire dans une chaîne
14-3. Accès direct aux données d'une chaîne
14-4. Affectation de chaîne de caractères
14-5. Concaténation de chaînes de carctères
14-6. Copie de travail des données d'une basic_string
14-7. Extraction de sous-chaîne
14-8. Insertion de caractères dans une chaîne
14-9. Suppression de caractères dans une chaîne
14-10. Remplacement d'une sous-chaîne dans une chaîne
14-11. Échange du contenu de deux chaînes de caractères
14-12. Comparaisons de chaînes de caractères
14-13. Recherches dans les chaînes de caractères
14-14. Lecture de lignes sur le flux d'entrée
14-15. Utilisation des pointeurs automatiques
14-16. Sortie d'un pointeur d'un auto_ptr
14-17. Utilisation des paires
14-18. Manipulation des nombres complexes
14-19. Modification de la taille d'un valarray
14-20. Opérations sur les valarray
14-21. Décalages et rotations de valeurs
14-22. Sélection des éléments d'un valarray par un masque
14-23. Sélection des éléments d'un valarray par indexation
14-24. Sélection par indexation implicite
14-25. Utilisation d'un bitset
14-26. Manipulation des bits d'un champ de bits
15-1. Lecture et écriture dans un tampon de chaîne de caractères
15-2. Lecture et écriture dans un tampon de fichier
15-3. Modification des options de formatage des flux
15-4. Définition d'un nouvel opérateur d'insertion pour un flux de sortie
15-5. Écriture de données brutes sur un flux de sortie
15-6. Utilisation des manipulateurs sur un flux de sortie
15-7. Écriture d'un nouvel opérateur d'extraction pour un flux d'entrée
15-8. Lectures de lignes sur le flux d'entrée standard
15-9. Utilisation de flux d'entrée / sortie sur chaînes de caractères
15-10. Utilisation de flux d'entrée / sortie sur un fichier
15-11. Repositionnement du pointeur de fichier dans un flux d'entrée / sortie
16-1. Programme C++ prenant en compte la locale de l'environnement
16-2. Conversion d'une wstring en string
16-3. Conversion d'une chaîne de caractères larges en chaîne à encodage variable
16-4. Détermination de la longueur d'une chaîne de caractères à encodage variable
16-5. Comparaison de chaînes de caractères localisées
16-6. Définition de nouvelles facettes
16-7. Spécialisation d'une facette existante
17-1. Construction et initialisation d'une liste
17-2. Insertion d'éléments dans une liste
17-3. Accès à la tête et à la queue d'une liste
17-4. Manipulation de listes
17-5. Accès aux éléments d'un vecteur
17-6. Utilisation d'une pile
17-7. Utilisation d'une file
17-8. Utilisation d'une file de priorité
17-9. Construction et initialisation d'une association simple
17-10. Insertion et suppression d'éléments d'une association
17-11. Recherche dans une association
17-12. Utilisation d'un foncteur de comparaison personnalisé
17-13. Définition directe du foncteur de comparaison pour les recherches
18-1. Algorithme de génération d'objets et de remplissage d'un conteneur
18-2. Algorithme de copie inverse
18-3. Algorithme d'échange
18-4. Algorithme de suppression
18-5. Algorithme de suppression des doublons
18-6. Algorithme de recherche et de remplacement
18-7. Algorithme de rotation
18-8. Algorithme de permutation
18-9. Algorithme d'inversion
18-10. Algorithme de mélange
18-11. Algorithmes d'itération
18-12. Algorithme de décompte d'éléments
18-13. Algorithme d'accumulation
18-14. Algorithme de produit scalaire
18-15. Algorithmes de sommes partielles et de différences adjacentes
18-16. Algorithme de recherche d'éléments
18-17. Algorithmes de recherche de motif
18-18. Algorithme de recherche de doublons
18-19. Algorithmes de manipulation des tas
18-20. Algorithme de tri
18-21. Algorithme de tri partiel
18-22. Algorithme de positionnement du nième élément
18-23. Algorithmes de détermination du maximum et du minimum
18-24. Algorithmes de détermination des bornes inférieures et supérieures
18-25. Algorithme de recherche binaire
18-26. Algorithme de comparaison de conteneurs
18-27. Algorithme de comparaison lexicographique
18-28. Algorithme de détermination d'inclusion
18-29. Algorithme d'intersection d'ensembles
18-30. Algorithmes d'union et de fusion d'ensembles
18-31. Algorithme de réunification de deux sous-ensembles
18-32. Algorithmes de différence d'ensembles
18-33. Algorithme de partitionnement