Ce support s’adresse à tout développeur désireux d’apprendre le langage C++, dans le cadre de ses études ou pour consolider son expérience professionnelle. Le premier chapitre présente les bases de la syntaxe du langage ainsi que l’organisation des programmes. Le chapitre suivant explique les notions clés pour créer ses premières applications : gestion de la mémoire, pointeurs, bibliothèques standards… Le troisième chapitre détaille la structuration des données, conduisant à la programmation...
Ce support s’adresse à tout développeur désireux d’apprendre le langage C++, dans le cadre de ses études ou pour consolider son expérience professionnelle.
Le premier chapitre présente les bases de la syntaxe du langage ainsi que l’organisation des programmes. Le chapitre suivant explique les notions clés pour créer ses premières applications : gestion de la mémoire, pointeurs, bibliothèques standards… Le troisième chapitre détaille la structuration des données, conduisant à la programmation orientée objet et aux mécanismes spécifiques au langage (héritage, modèles de classes…). Vient ensuite l’étude de la STL (Standard Template Library), présentée à travers ses mécanismes les plus importants : les chaînes, les structures de données et les parcours de collection. Les évolutions du C++ moderne telles que les lambda-expressions, les smart-pointers et l’inférence de type sont étudiées en préalable à la bibliothèque boost. Un chapitre ouvre C++ sur ses univers, tels que l’environnement managé .NET C++ CLI et les applications Win32.
Comme illustration des capacités de C++ à créer tout type d’applications, l’auteur propose un exemple complet de tableur graphique, un interprète du langage tiny-Lisp, un programme de compression de fichiers ou encore un réseau de neurones appliqué à un démonstrateur de calculs.
L’ouvrage se termine par un chapitre appliquant des algorithmes essentiels en C++ traitant de la reconnaissance de motifs, la recherche dans un graphe et de compression de données.
Le code source des exemples du livre est disponible en téléchargement sur www.editions-eni.fr. Les exemples sont réalisés avec Visual Studio Community Edition sous Windows et avec Eclipse sous Linux Ubuntu.
1.3 Environnement de développement et fichier makefile
1.3.1 Choix d'un EDI
1.3.2 Construction d'un fichier makefile
1.4 Organisation d'un programme C++
1.4.1 Codes sources
1.4.2 Modules objets
1.4.3 Bibliothèques (librairies)
1.4.4 Exécutable
1.5 Préprocesseur
1.6 Choix d'un compilateur
1.7 Éditeur de liens
2. Les premiers programmes
2.1 Les commentaires
2.2 Déclaration de variables
2.2.1 Utilité des variables
2.2.2 Portée des variables
2.2.3 Syntaxe de déclaration
2.2.4 Types de données
2.2.5 Les types entiers
2.2.6 Les types décimaux
2.2.7 Le booléen
2.2.8 Les caractères et les chaînes
2.3 Instructions de tests et opérateurs
2.3.1 Instructions de tests
2.3.2 Opérateurs
2.3.3 Opérateurs booléens
2.3.4 Opérateurs d'incrémentation
2.3.5 Instructions de boucle
2.3.6 La boucle while
2.3.7 La boucle for
2.3.8 La boucle do
2.3.9 Les instructions de débranchement
3. Tableaux
3.1 Déclarer des tableaux
3.2 Tableaux dynamiques
4. Fonctions et prototypes
4.1 Déclaration d'une fonction
4.2 Fonctions et procédures
4.3 Appel des fonctions
4.4 Gestion des variables locales
4.5 Définition de fonctions homonymes (polymorphisme)
4.6 Fonctions à nombre variable d’arguments
4.7 Attribution de valeurs par défaut aux arguments
4.8 Fonctions en ligne
4.9 Fonctions externes de type C
4.10 Fonctions récursives
4.11 La fonction main()
De la mémoire pour les programmes
1. Pointeurs
1.1 Pointeurs sur des variables
1.2 Pointeurs et tableaux
1.3 Allocation de mémoire
1.3.1 Allocation par malloc()
1.3.2 Allocation par new
1.4 Arithmétique des pointeurs
1.5 Pointeurs de pointeurs
1.6 Pointeurs de fonctions
1.6.1 Utilisation pour rendre les algorithmes génériques
1.6.2 Fonctions callback
2. Références
2.1 Une plus grande sécurité
2.2 Les références constantes
2.3 Renvoyer une référence depuis une fonction
3. Constantes
3.1 Constantes symboliques
3.2 Le type void
3.3 Les alias de type : typedef
3.4 Constantes et énumérations
4. Exercices pratiques
4.1 Rechercher la valeur maximale dans un tableau
4.1.1 Déclaration du tableau
4.1.2 Implémentation de l'algorithme sous forme d'une fonction
4.1.3 Exécution de l'algorithme
4.2 Rechercher l'adresse de la valeur maximale dans un tableau
4.3 Utiliser les références pour rechercher l'index de la valeur maximale dans un tableau
Structuration des données
1. Programmation structurée
1.1 Structures
1.2 Constitution d'une structure
1.3 Instanciation de structures
1.4 Instanciation au moment de la définition
1.5 Instanciation par réservation de mémoire
1.6 Instanciation avec l'opérateur new
1.7 Pointeurs et structures
1.8 Organisation de la programmation
1.8.1 Inclusion à l'aide de #include
1.8.2 Protection contre les inclusions multiples
1.9 Unions
1.10 Copie de structures
1.11 Création d'alias de types de structures
2. Structures et fonctions
2.1 Passer comme paramètre une structure par valeur
2.2 Passer comme paramètre une structure par référence
2.3 Passer comme paramètre une structure par adresse
2.4 De la programmation fonctionnelle à la programmation objet
2.5 Gestion de la mémoire
2.5.1 Alignement des données
2.5.2 Allocation de mémoire interprocessus
3. La bibliothèque standard du C
3.1 Les fonctions communes du langage C
3.2 Chaînes
3.3 Fichiers
4. Exercices pratiques
4.1 Les structures
4.2 La fonction d'initialisation
4.3 Les fonctions d'affichage
4.4 Les fonctions d'entrées et de sorties
4.5 La fonction principale
4.6 Exécution du programme et tests
La programmation orientée objet
1. Classes et instances
1.1 Définition de classe
1.2 Les modificateurs d'accès
1.3 Organisation de la programmation des classes
1.4 Instanciation
1.5 Constructeur
1.6 Le pointeur this
1.7 Destructeur
1.8 Destructeur virtuel
1.9 Allocation dynamique
1.10 Constructeur de copie
2. Héritage
2.1 Dérivation de classe (héritage)
2.2 Exemple de dérivation de classe
2.3 Héritage public, protégé et privé
2.4 Appel des constructeurs
2.5 Polymorphisme
2.6 Méthodes polymorphes
2.7 Conversions d'objets
2.8 Méthodes virtuelles et méthodes virtuelles pures
2.9 Héritage multiple
2.10 Notations particulières pour l'héritage multiple
2.11 Conséquences de l'héritage multiple sur la programmation
3. Autres aspects de la POO
3.1 Conversion dynamique
3.1.1 Conversions depuis un autre type
3.1.2 Opérateurs de conversion
3.1.3 Conversions entre classes dérivées
3.2 Champs et méthodes statiques
3.2.1 Champs statiques
3.2.2 Méthodes statiques
3.3 Surcharge d'opérateurs
3.3.1 Syntaxe
3.3.2 Surcharge de l'opérateur d'indexation
3.3.3 Surcharge de l'opérateur d'affectation
3.3.4 Surcharge de l'opérateur de conversion
3.4 Fonctions amies
3.5 Adressage relatif et pointeurs de membres
3.5.1 Notations
3.5.2 Construction d'un middleware orienté objet
4. Les exceptions plus sûres que les erreurs
4.1 Propagation explicite
4.2 Types d'exceptions personnalisés
4.2.1 Définition de classes d'exception
4.2.2 Instanciation de classes
4.2.3 Classes d'exception dérivées
4.3 Prise en charge d'une exception et relance
4.4 Exceptions non interceptées
4.5 Acquisition de ressources
5. Programmation générique
5.1 Modèles de fonctions
5.2 Modèles de classes
6. Travaux pratiques
6.1 Utilisation de l'héritage de classes dans l'interprète tiny-lisp
6.2 Des pointeurs de membres pour des fonctions callback
La librairie standard STL
1. Introduction
2. Organisation des programmes
2.1 Espaces de noms
2.1.1 Utilisation complète d'un espace de noms
2.1.2 Espace de noms réparti sur plusieurs fichiers
2.1.3 Relation entre classe et espace de noms
2.1.4 Déclaration de sous-espaces de noms
2.2 Présentation de la librairie STL
3. Flux C++ (entrées-sorties)
3.1 Généralités
3.2 Flux intégrés
3.3 État d'un flux
3.4 Mise en forme
3.5 Flux de fichiers
3.6 Flux de chaînes
3.7 Paramètres locaux
4. Classe string pour la représentation des chaînes de caractères
4.1 Représentation des chaînes dans la librairie STL
4.2 Mode d'emploi de la classe string
4.2.1 Fonctions de base
4.2.2 Constructeurs
4.2.3 Itérateurs
4.2.4 Accès aux éléments
4.3 Intégration dans le langage C++
4.3.1 Affectations
4.3.2 Comparaisons
4.3.3 Conversion avec le C
4.4 Fonctions spécifiques aux chaînes
4.4.1 Insertion
4.4.2 Concaténation
4.4.3 Recherche et remplacement
4.4.4 Extraction de sous-chaîne
5. Conteneurs dynamiques
5.1 Conteneurs
5.1.1 Insertion d'éléments et parcours
5.1.2 Itérateurs
5.1.3 Opérations applicables à un vecteur
5.2 Conteneurs standard
5.2.1 Itérateurs
5.2.2 Accès aux éléments
5.2.3 Opérations sur pile et file
5.2.4 Opérations sur listes
5.2.5 Opérations associatives
5.3 La séquence list
5.4 La séquence deque
5.5 Adaptateurs de séquences
5.6 La pile stack
5.7 La file queue
5.8 La file d'attente à priorité
5.9 Le conteneur associatif map
5.10 Les conteneurs associatifs multimap, set et multiset
6. Algorithmes
6.1 Opérations de séquence sans modification
6.2 Opérations de séquence avec modification
6.3 Séquences triées
6.4 Algorithmes ensemblistes
6.5 Minimum et maximum
6.6 Calcul numérique
6.6.1 Limites des formats ordinaires
6.6.2 Fonctions de la bibliothèque
6.6.3 Fonctions de la bibliothèque standard et classe valarray
7. Des apports du C++ moderne
7.1 Les lambda-expressions
7.2 L'inférence de type
7.3 De nouveaux types de boucles
7.4 Des pointeurs intelligents
8. Introduction à la bibliothèque boost
8.1 Installation de la bibliothèque
8.2 Un premier exemple avec boost
8.3 Domaines d'application
9. Travaux pratiques
9.1 La classe Variant
9.2 La méthode to_string()
9.3 La traduction JSON
9.3.1 La méthode statique to_json_string()
9.3.2 La méthode statique from_json_string()
Les environnements de C++
1. L'environnement Windows
1.1 Les programmes Win32
1.1.1 Choix du mode de compilation
1.1.2 Fonctionnement des applications fenêtrées Win32
1.1.3 Création d'un projet d'application fenêtrée
1.1.4 Les types de données Win32
1.1.5 Les handles et les messages
1.1.6 La boucle de message
1.1.7 Les fichiers de ressource
1.2 L'environnement .NET
1.2.1 Le code managé et la machine virtuelle CLR
1.2.2 Les adaptations du langage C++ CLI
1.2.3 La norme CTS
1.2.4 La classe System::String
1.2.5 Le garbage collector
1.2.6 Fonctionnement du ramasse-miettes
1.2.7 Les tableaux et les fonctions à nombre variable d'arguments
1.2.8 Les propriétés
1.2.9 Les délégués et les événements
1.2.10 Les méthodes virtuelles
1.2.11 Les classes abstraites et les interfaces
1.2.12 Le framework .NET
1.2.13 Les références d'assemblages
1.2.14 L'espace de noms System::IO
1.2.15 L'espace de noms System::Xml
1.2.16 L'espace de noms System::Data
1.2.17 L'espace de noms System::Collections
1.2.18 L'espace de noms System::Collections::Generic
1.3 Les relations avec les autres langages : exemple du C#
2. Applications
2.1 Réaliser une application de dessin Win32
2.2 Une application en C++ pour .NET : le tableur InCell
2.2.1 Architecture du tableur
2.2.2 La feuille de calcul
2.2.3 L'ordonnanceur de calcul
2.2.4 Zoom sur l'évaluateur
2.2.5 L'interface graphique
2.3 Un module de gestion de données pour tiny-lisp
2.3.1 Création de listes persistantes db_create
2.3.2 Accès aux listes persistantes db_use
2.3.3 Insertion d'items db_insert
2.3.4 Enregistrement des listes persistantes db_save
2.3.5 Sélection d'items dans les listes persistantes db_select
Programmer des algorithmes en C++
1. Introduction
2. Reconnaissance de motifs textuels
2.1 Approche directe
2.2 Lecture avec déplacement : l'algorithme Boyer-Moore
2.3 Méthode pour les motifs auto répétitifs : l'algorithme KMP
3. Recherche du plus court chemin
3.1 Présentation des graphes
3.1.1 Incidence et adjacence
3.1.2 Chemin d'un graphe
3.1.3 Le parcours de graphe en largeur d'abord
3.2 L'algorithme de Dijkstra
3.3 Utilisation d'une méthode avec heuristique : l'algorithme A*
4. Comprimer des fichiers
4.1 Approche par statistique : l'algorithme d'Huffman
4.1.1 Implémentation du codage
4.1.2 Compression du fichier
4.1.3 Décompression
4.2 Approche par dictionnaire : l'algorithme LZW
4.2.1 Fonctionnement de l'algorithme
4.2.2 Implémentation du dictionnaire
4.2.3 Dimensionnement et gestion du dictionnaire
4.2.4 Programme de compression
4.2.5 Programme de décompression
5. Implémenter un réseau de neurones en C++
5.1 Un réseau de neurones pour l'algorithmique ?
5.2 Implémentation d'un réseau de neurones en C++
5.3 Une classe abstraite pour piloter le réseau
5.4 Modéliser une porte logique
5.5 Un moteur d'inférence pour l'arithmétique entière
5.5.1 Apprentissage des symboles
5.5.2 Utilisation du réseau
Index
Brice-Arnaud GUÉRIN
Ingénieur ESIEA, Brice-Arnaud GUERIN est Directeur de programmes chez Kantar et auteur aux Editions ENI depuis 2003. Ses compétences en développement et son désir de partager ses connaissances l'ont naturellement conduit à l'écriture d'ouvrages consacrés à la conduite de projets et à la réalisation d'applications (C++, .NET, PHP).