COURS PROGRAMMATION C++ I DIGL L2 2I
Chapitre 1 : Présentation du langage C++
I. Historique
À l'origine, un ordinateur ne comprenait que le langage binaire : un programme était constitué d'une
suite de 0 et de 1. Le programmeur devait lui- même traduire son programme sous cette forme. En
1950, Alan Turing et Maurice V. Wilkes de l'université de Cambridge branchent un clavier à un
ordinateur, il est dorénavant possible de rentrer des mots associés au langage machine. Par exemple :
mov, load, sub… Ces mots ne sont pas compris par l’ordinateur qui ne comprend que le langage
binaire. Il faut alors un « assembleur » qui transforme le code en langage binaire.
La nécessité de créer un langage de haut niveau se fait sentir, le FORTRAN (FORmula TRANslator,
traducteur de formules) est créé en 1957. Il est utilisé pour des programmes mathématiques et
scientifiques.
En 1970, Ken Thompson, créa un nouveau langage : Le B, descendant du BCPL (Basic Combined
Programming Language, créé en 1967 par Martin Richards). Son but était de créer un langage simple,
malheureusement, son langage fut trop simple et trop dépendant de l’architecture utilisée…
En 1971 Dennis Ritchie commence à mettre au point le successeur du B, le C. Le résultat est
convaincant : Le C est totalement portable (il peut fonctionner sur tous les types de machines et de
systèmes), il est de bas niveau (il peut créer du code aussi rapide que de l’assembleur) et il permet de
traiter des problèmes de haut niveau. Le C permet de quasiment tout faire, du driver au jeu.
Le C devient très vite populaire, tout le monde veut créer sa version. Beaucoup de compilateurs qui
voient le jour sont incompatibles entre eux et la portabilité est perdue. Il est décidé qu’il faut un
standard pour le C. L'ANSI (American National Standards Institute) s’en charge en 1983. La plupart
des compilateurs se conforment à ce standard. Un programme écrit en C ANSI est compatible avec
tous les compilateurs.
Il manque la programmation orientée objet au C. C’est pourquoi Bjarne Stroustrup, des laboratoires
Bell, crée le C++, dont le développement a commencé au début de années 1980. Il construit donc le
C++ sur la base du C. C++ est capable de compiler un programme C, et garde donc une forte
compatibilité avec le C.
Les langages C et C++ sont les langages les plus utilisés dans le monde de la programmation.
II. Présentation du C++
Le C++ est un langage multiparadigme. Il supporte essentiellement les paradigmes suivants :
Programmation procédurale : il reprend essentiellement les concepts du langage C,
notamment la notion de fonction (une procédure étant une fonction avec un retour de type 'void')
;
Programmation structurée : il reprend la notion struct du langage C. Cette notion est
considérée en C++ aussi comme des classes dont l'accès par défaut est public ;
Programmation orientée-objet : il implémente la notion de classe (dont l'accès par défaut est
privé), d'encapsulation grâce aux restrictions d'accès (publique, protégé, privé), d'héritage
(simple ou multiple) à l'aide du mécanisme de dérivation, d'abstraction grâce aux classes de
base abstraites pures (on peut parler d'interface bien que les héritages multiples sur une
interface C++ lèvent des difficultés montrant que leur implémentation est plus proche d'une
classe abstraite que d'une vraie interface comme on peut en trouver en Java) ou non, de
polymorphisme dynamique (ou au runtime) grâce aux fonctions membres virtuelles ;
Programmation générique ou méta-programmation : il introduit les templates ou modèles
générique de code qui permettent de créer automatiquement des fonctions ou des classes à
partir d'un ou plusieurs paramètres.
Programmation 'lambda-closure' : le C++ 11 introduit la notion de fermeture.
Outre ces grands paradigmes, C++ implémente la notion de typage strict, de constance, de
1 Adner sodrel LEPHOYO
COURS PROGRAMMATION C++ I DIGL L2 2I
polymorphisme statique (ou à la compilation) grâce à la surcharge et aux fonctions génériques, de
références (une alternative aux pointeurs bien plus robuste et bien moins dangereuse) et permet
également la surcharge d'opérateurs et de simuler les mixins grâce au mécanisme de dérivation
multiple. Il est largement compatible avec le langage C, ce qui est à la fois une richesse et un problème.
En effet, le langage C est actuellement (en 2006) un langage largement utilisé pour écrire des systèmes
d'exploitation (Windows, Linux, Mac OS). Le C++ peut donc très naturellement avoir un accès direct
au système d'exploitation dans le cadre d'une programmation de bas niveau, tout en permettant une
programmation de haut niveau en exploitant toute la richesse des concepts orientés objet. Le problème
levé par ce lien filial étant que les développeurs ayant appris le C avant le C++ utilisent les techniques
C là où le C++ possède des ajouts moins dangereux (par exemple, les références). Ce type de code est
surnommé « C with classes ».
III. Les apports du C++ par rapport au C
Le C++ a apporté par rapport au langage C les notions suivantes :
▪ les concepts orientés objet (encapsulation, héritage) ;
▪ les références ;
▪ la vérification stricte des types ;
▪ les valeurs par défaut des paramètres de fonctions ;
▪ la surcharge de fonctions (plusieurs fonctions portant le même nom se distinguent par le
nombre et/ou le type de leurs paramètres) ;
▪ la surcharge des opérateurs (pour utiliser les opérateurs avec les objets) ;
▪ la possibilité de déclaration de variables entre deux instructions d'un même bloc.
▪ les templates de classes et de fonctions ;
▪ les constantes typées ;
▪ la possibilité de déclaration de variables entre deux instructions d'un même bloc.
IV. Compilation
1. Définition de la compilation
La compilation consiste en une série d'étapes de transformation du code source en du code machine
exécutable sur un processeur cible. Le langage C++ fait partie des langages compilés : le fichier
exécutable est produit à partir de fichiers sources par un compilateur.
Contrairement aux langages interprétés où il faut un logiciel interprétant le source, le fichier
exécutable est produit pour une machine donnée : il est directement exécuté par le processeur.
L'exécution est donc plus rapide.
Phases de la compilation
La compilation passe par différentes phases, produisant ou non des fichiers intermédiaires :
▪ Préprocessing : Le code source original est transformé en code source brut. Les commentaires
sont enlevés et les directives de compilation commençant par # sont d'abord traités pour obtenir le
code source brut ;
▪ Compilation en fichier objet : les fichiers de code source brut sont transformés en un fichier
dit objet, c'est-à-dire un fichier contenant du code machine ainsi que toutes les informations
nécessaires pour l'étape suivante (édition des liens). Généralement, ces fichiers portent l'extension
.objou .o;
▪ Édition de liens : dans cette phase, l'éditeur de liens (linker) s'occupe d'assembler les fichiers
objet en une entité exécutable et doit pour ce faire résoudre toutes les adresses non encore
résolues, tant des mémoires adressées que des appels de fonction. L'entité exécutable est
généralement soit un exécutable, soit une bibliothèque dynamique (DLLs sous Windows et toutes
les variantes, tels que objet COM, OCX, etc, et les .so sous Linux).
2 Adner sodrel LEPHOYO
COURS PROGRAMMATION C++ I DIGL L2 2I
Les compilateurs sont capables de générer des bibliothèques statiques, qui sont en quelques sortes le
rassemblement d'un ensemble de fichiers objet au sein d'un même fichier. Dans ce cas, la phase
d'édition de liens n'a pas eu lieu.
Cette découpe en phases permet de compiler séparément les bibliothèques en fichiers objets, et
l'application et évite donc de tout re-compiler, ce qui prendrait beaucoup de temps pour les
applications ayant un code source important.
2. Les fichiers sources
Les fichiers sources d'un programme C++ portent souvent l'extension .cpp, .cxx, .cc, parfois .C et
sont des fichiers textes lisibles par le programmeur.
Les fichiers d'en-tête
Les fichiers "entêtes" ("headers" en anglais), traditionnellement d'extension .h ou .hpp (mais la
plupart des entêtes systèmes du C++ standard n'ont plus d'extension du tout), contiennent
généralement les prototypes de différentes fonctions, structures et classes. Ces prototypes
proviennent :
▪ des bibliothèques standards du C++ : tout compilateur C++ doit fournir ces fichiers ainsi que les
fichiers objets contenant l'implémentation des bibliothèques standards (souvent liées par défaut) ;
▪ de bibliothèques non standards fournis par l'éditeur du compilateur ou de l'environnement de
développement ;
▪ de bibliothèques non standards (gratuites ou payantes) que le programmeur s'est procuré : citons
par exemple la bibliothèque permettant d'accéder à une base de données mySQL. Lorsqu'une
bibliothèque non standard est utilisée et que celle-ci englobe de nombreuses fonctionnalités
(interface graphiques, accès à une base de données, surcouche système, communications
réseaux, etc.), on parle parfois de framework. Citons par exemple Qt et WxWidgets dans cette
catégorie. Un framework apparait parfois comme une véritable surcouche du système
d'exploitation.
Les fichiers .cpp
Les fichiers .cpp (parfois .c ou .cc) contiennent la définition (l'implémentation) des différentes
fonctions et méthodes définies dans les fichiers d'en- tête. La compilation des fichiers .cpp produit
dans un premier temps des fichiers objets (extension .obj ou .o en général).
À noter que ces fichiers .cpp utilisent les fichiers d'en-tête. Ils les appellent en utilisant la syntaxe
#include "nomdefichier" (nomdefichier comprenant l'extension, donc, souvent ".h"). Comme
indiqué ci-dessus, ces fichiers d'en-tête seront donc inclus complètement par le préprocesseur à
l'intérieur du code source brut.
3. L'édition de liens (linking)
L'édition de liens est la phase finale de la compilation qui va rassembler tous les fichiers objets afin
de former un fichier exécutable. Les fichiers objets proviennent :
▪ de la compilation de fichiers .cpp ;
▪ de la bibliothèque standard (ceux-ci sont souvent liés automatiquement) ;
▪ de bibliothèques ou framework extérieurs. Il faut dans ce cas explicitement dire à l'éditeur de
liens quels sont les fichiers qu'il doit lier.
4. Les projets
3 Adner sodrel LEPHOYO
COURS PROGRAMMATION C++ I DIGL L2 2I
Les makefiles
Afin de rendre possible le développement d'applications, les fichiers sources sont organisés sous forme
de projet. Le C++ ayant été conçu sur les bases du C, il s'est ensuivi une gestion assez équivalente des
projets. Avant l'avènement des environnements intégrés tels qu'on les connaît aujourd'hui, bon
nombre de projets étaient construits sous forme de "makefile"s pris en charge par un outil spécifique
make. De nos jours, cettetechnique est encore fortement utilisée dans les environnements UNIX et
Linux. Il existe des alternatives plus modernes à make tels que CMake, automake, SCons,
Boost.Build (bjam)…
Les environnements de développement intégrés
Les environnements de développement intégrés (EDI en français et IDE en anglais) sont des
outils complets permettant de développer dans un certain langage de programmation. Ils
contiennent en général :
▪ un compilateur ;
▪ un éditeur avec mise en évidence de la syntaxe (syntax highlighting) ;
▪ des outils facilitant la gestion d'un projet :
▪ outil pour ajouter/supprimer/déplacer des sources,
▪ outil pour paramétrer la compilation et l'édition de liens,
▪ outil pour créer des modes de compilation (typiquement debug/release) et tous les
paramètres y afférent ;
▪ des bibliothèques non standard censées aider le programmeur. Parfois, il s'agit d'un véritable
framework ;
▪ des outils pour permettre le lancement de l'application ;
▪ des outils pour déboguer l'application ;
▪ des outils pour créer des interfaces graphiques ;
▪ …
5. Quelques exemples
Multi-plateformes
▪ Eclipse, gratuit et Open Source, avec le plugin CDT, permet le développement en C/C++
▪ Code::Blocks, gratuit et Open Source (EDI complet fournit avec gcc mais utilisable avec
d'autres compilateurs).
▪ CodeLite, gratuit et Open Source de base, seule exception : les plugins développés en annexe
pour cet EDI peuvent être de n'importe quelle licence, y compris propriétaire et fermée.
▪ Qt Creator, gratuit et Open Source, dédié au framework Qt (mais n'impose pas son usage).
Sous windows
▪ Visual C++ de Microsoft (basé sur Visual studio).
▪ Visual C++ Express (disponible gratuitement et complètement utilisable).
▪ Borland C++ Builder.
▪ Devcpp (disponible gratuitement sous Windows).
▪ CLion de Jetbrains
Sous Linux
4 Adner sodrel LEPHOYO
COURS PROGRAMMATION C++ I DIGL L2 2I
▪ Anjuta
▪ Kdevelop
▪ g++ (Commun à tout système Unix, ligne de commande)
▪ clang (Plus rapide que GCC mais toutefois compatible, ligne de commande)
Sous MacOS X
▪ Apple Xcode (livré avec Mac OS X, utilise le compilateur clang).
▪ Metrowerks CodeWarrior.
▪ g++ (commun à tout système Unix, ligne de commande)
V. Un premier programme
Après ces quelques introductions, nous allons désormais pouvoir commencer à apprendre le C++.
1. Le fichier source
Tapez le fichier suivant dans un éditeur de texte :
#include <iostream>
using namespace std;
int main()
{
cout << "BONJOUR" << endl;
return 0;
}
En général, un fichier source C++ utilise l'extension .cpp. On trouve également l'extension .cc. Le
principal est de choisir l'extension une fois pour toute, pour la cohérence des fichiers.
2. Explications
La directive #include
La directive de compilation #include <iostream> permet d'inclure les prototypes des différentes
classes contenues dans la bibliothèque standard iostream. Cette bibliothèque contient la définition
de cout qui permet entre autres d'afficher des messages à l'écran.
L'espace de nommage standard
Un espace de nommage peut être vu comme un ensemble d'identifiants C++ (types, classes, variables
etc.). cout fait partie de l'espace de nommage std. Pour parler de l'objet prédéfini cout de l'espace de
nommage std, on peut écrire std::cout. Cette notation est assez lourde car elle parsème le code de
std::. Pour cela on a écrit using namespace std qui précise que, par défaut, la recherche s'effectuera
aussi dans l'espace de nommage std. On pourra donc alors écrire tout simplement cout pour parler
de std::cout. On dit que std est un espace de nom (namespace en anglais).
La fonction main
5 Adner sodrel LEPHOYO
COURS PROGRAMMATION C++ I DIGL L2 2I
Tout programme en C++ commence par l'exécution de la fonction main. Il se termine lorsque la
fonction main est terminée. La fonction main peut être vue comme le point d'entrée de tout
programme en C++. Cette fonction renvoie un entier, très souvent 0, qui permet d'indiquer au système
d'exploitation que l'application s'est terminée normalement.
L'objet cout
Il permet d'envoyer des caractères vers le flux de sortie standard du programme, c'est-à-dire l'écran
pour ce programme (sa fenêtre console). Il permet donc d'afficher des messages à l'écran. En utilisant
l'opérateur <<, on peut écrire une chaîne de caractères à l'écran. L'instruction cout << "BONJOUR";
affiche donc le message BONJOUR à l'écran.
return 0
Cette instruction (facultative ici) indique que la fonction main est terminée et que tout s'est bien passé.
Nous verrons plus loin ce que veut dire exactement l'instruction return, mais même si elle est
facultative il est fortement recommandé de la mettre, que ce soit par simple souci de conformité ou
du fait que votre programme est censé renvoyer une valeur à la fin de son exécution.
3. Exécution
Si on compile et exécute ce programme, le message BONJOUR s'affiche à l'écran.
Il est possible que vous ne voyiez qu’une fenêtre noire "flasher" si vous êtes sous Windows. Pour
résoudre ce problème, ajoutez avant le "return 0" l’instruction :
system("pause");
6 Adner sodrel LEPHOYO