Chapitre 1 Introduction
1.1 Un peu d'histoire
Le langage C++ a deux grands ancêtres :
-
Simula, dont la première version a été conçue en 1967. C'est le
premier langage qui introduit les principaux concepts de la programmation
objet. Probablement parce qu'il était en avance sur son temps, il n'a pas
connu à l'époque le succès qu'il aurait mérité, mais il a eu cependant
une influence considérable sur l'évolution de la programmation objet.
Développé par une équipe de chercheurs norvégiens, Simula-67 est le
successeur de Simula I, lui-même inspiré d'Algol 60. Conçu d'abord à des
fins de modélisation de systèmes physiques, en recherche nucléaire
notamment, Simula I est devenu un langage spécialisé pour traiter des
problèmes de simulation. Ses concepteurs faisaient aussi partie du groupe
de travail Ifip1
qui poursuivait les travaux ayant donné naissance à Algol 60.
Simula-67 est avec Pascal et Algol 68 l'un des trois langages issus des
différentes voies explorées au sein de ce groupe. Son nom fut changé en
Simula en 1986.
Comme son prédécesseur Simula I, Simula permet de traiter les
problèmes de simulation.
En particulier, un objet est considéré comme un programme actif autonome,
pouvant communiquer et se synchroniser avec d'autres objets.
C'est aussi un langage de programmation général, reprenant les
constructions de la programmation modulaire introduites par Algol 60.
Il y ajoute les notions de classe, d'héritage et
autorise le masquage des méthodes, ce qui en fait un véritable
langage à objets.
- Le langage C a été conçu en 1972 aux laboratoires Bell Labs.
C'est un langage structuré et modulaire, dans la philosophie générale de
la famille Algol. Mais c'est aussi un langage proche du système, qui a
notamment permis l'écriture et le portage du système Unix. Par
conséquent, la programmation système s'effectue de manière
particulièrement aisée en C, et on peut en particulier accéder
directement aux fonctionnalités du noyau Unix.
C possède un jeu très riche d'opérateurs, ce qui permet l'accès à la
quasi-totalité des ressources de la machine. On peut par exemple faire de
l'adressage indirect ou utiliser des opérateurs d'incrémentation ou de
décalage. On peut aussi préciser qu'on souhaite implanter une variable
dans un registre. En conséquence, on peut écrire des programmes presque
aussi efficaces qu'en langage d'assemblage, tout en programmant de
manière structurée.
Le concepteur de C++, Bjarne Stroustrup, qui travaillait également aux
Bell Labs, désirait ajouter au langage C les classes de Simula.
Après plusieurs versions préliminaires, le langage a trouvé une première
forme stable en 1983, et a très rapidement connu un vif succès dans le
monde industriel.
Mais ce n'est que plus tard que le langage a trouvé sa forme
définitive, confirmée par une norme.
C++ peut être considéré comme un successeur de C.
Tout en gardant les points forts de ce langage, il corrige certains points
faibles et permet l'abstraction de données.
De plus, il permet la programmation objet.
D'autres langages, et en particulier Java et C#, se sont fortement inspirés de la
syntaxe de C++. Celle-ci est de ce fait devenue une référence.
Nous supposons en particulier que les élèves qui ont déjà appris Java ne
seront pas dépaysés par ce langage.
Cependant, nous voulons mettre en garde contre plusieurs fausses
ressemblances : si la syntaxe est la même ou très proche, plusieurs
concepts sous-jacents sont différents. Nous nous efforcerons de signaler
ces pièges potentiels.
Pour le lecteur qui voudrait en savoir plus que les informations
succinctes données par ce polycopié, il existe de très nombreux
ouvrages consacrés à C++. Il nous est difficile de faire un tri
sérieux, la qualité de ces ouvrages étant très variable.
Je conseille néanmoins les références à mon avis
incontournables [4, 9], ainsi qu'un excellent
ouvrage disponible gratuitement sur le Web [2].
Enfin, pour se perfectionner dans l'emploi de C++ comme langage de
programmation, il existe de nombreux ouvrages, dont les incontournables
contributions de Scott Meyers [5, 6, 7].
1.2 Implantation de modules en C++
Un module C++ (et en particulier une classe) est généralement implanté
par deux fichiers : un fichier d'interface, qui spécifie les services
offerts par le module (définition de types, interfaces dec classes,
déclaration de fonctions et de procédures) et un fichier
d'implantation dans lequel sont mises en oeuvre les fonctionnalités
déclarées dans l'interface.
Les extensions conventionnellement utilisées en C++ sont :
-
.h, .hh, .H pour les fichiers d'interface C++ (les
headers).
Remarque : la norme du langage C++ prévoit que les
fichiers d'interface perdent leur extension.
C'est la raison pour laquelle les interfaces spécifiques et standard de
C++ sont désormais désignées sans leur extension (comme iostream par
exemple).
-
.cc, .cpp, .C pour les fichiers d'implantation C++.
Il y a ici une première différence avec Java, où une classe est
complètement définie par un
seul et même fichier de suffixe .java.
En C++, une classe que nous appellerons Toto est
habituellement décrite dans deux fichiers séparés :
-
Toto.H ou Toto.hh ou Toto.
Ce fichier header décrit l'interface de la classe, et
contient :
-
des directives pour le préprocesseur (cf. § 5.2),
- l'inclusion d'autres fichiers headers pour des classes
employées dans le fichier courant,
- une définition formelle de la classe, avec ses constructeurs,
ses méthodes et ses variables.
- Toto.cpp. Ce fichier définit la mise en oeuvre de
la classe, et contient :
-
l'inclusion des headers nécessaires (l'inclusion de
Toto.hh -- ou autre nom donné au header de la
classe -- est obligatoire),
- la mise en oeuvre des constructeurs et des méthodes,
- l'implantation et l'initialisation des variables de classe.
Il faut bien noter que pour utiliser un type -- une classe -- dans un
module, il faut obligatoirement inclure son header, sinon la
compilation ne réussira pas, les interfaces des classes utilisées
n'étant pas trouvées (elles ne sont pas recherchées et chargées
automatiquement, comme en Java).
Nous reviendrons au § 5.1 sur les spécificités de
la compilation en C++.
- 1
- International Federation for Information Processing.