Premiers pas en C++
Notions clés
1. Principales caractéristiques du langage C++
Le langage C++ est apparu officiellement en 1983, date de ses premières utilisations hors du laboratoire AT&T qui l’a fait naître. Son concepteur, Bjarne Stroustrup, avait débuté ses travaux plusieurs années auparavant, sans doute vers 1980. Le langage C++ - appelé jusque-là « C avec des classes» - a été élaboré en conservant la plupart des concepts du langage C, son prédécesseur. Les deux langages se sont ensuite mutuellement échangés des concepts.
Comme le langage C, C++ adopte une vision très proche de la machine. Il a été destiné en premier lieu à l’écriture de systèmes d’exploitation mais ses caractéristiques lui ont ouvert d’autres perspectives.
Le langage est formé d’instructions très explicites et courtes dont la durée d’exécution peut être prévue en amont, au moment de l’écriture du programme.
Le nombre d’instructions et de notations étant volontairement limité, les interprétations des constructions sémantiques sont multiples et c’est sans doute ce que le concepteur du langage C++ désigne sous le terme d’expressivité.
Toutefois, Bjarne Stroustrup a veillé à contourner certains écueils du langage C et notamment sa tendance à tout ramener au niveau de l’octet; quantité numérique limitée et totalement obsolète dans l’histoire de l’informatique, même en 1980. Pour obtenir ce résultat, le langage s’est enrichi de classes qui décrivent des types de données adaptés aux différents besoins du programmeur. La visibilité du langage combinée à l’abstraction des classes fournit des programmes de haut niveau.
Les classes (et la programmation orientée objet) n’ont pas été inventées à l’occasion de C++. L’inventeur du langage s’est efforcé d’adapter des concepts de haut niveau introduits par le langage Simula en 1967, à une plate-forme très explicite, le langage C.
Il résulte de cette double filiation...
Les premiers programmes
Nous allons maintenant découvrir comment C++ permet d’implémenter des algorithmes. Ce langage appartient à la famille des langages procéduraux, ce qui signifie que les instructions d’un programme sont regroupées pour former des procédures, que l’on appelle aussi fonctions.
Un programme C++ utilise d’une part des variables pour ranger des valeurs et d’autre part des instructions pour faire évoluer ces valeurs. Ce n’est pas l’aspect le plus original de C++ puisqu’il partage cette base « algorithmique » avec le langage C. De ce fait, de nombreux types de données sont communs aux deux langages et les instructions de base sont également identiques. Ceci facilite l’apprentissage du langage C++ et améliore la portabilité ascendante.
Signalons aussi que la syntaxe C++ est un peu plus souple que celle du C, notamment en ce qui concerne la déclaration des variables et des paramètres. La relecture des programmes s’en trouve naturellement améliorée.
Pour le lecteur qui découvre la programmation orientée objet avec C++, il est essentiel d’assimiler pleinement la programmation fonctionnelle, c’est-à-dire à base de fonctions. Connaître les algorithmes de base - recherches, tris - est un très bon moyen d’y parvenir. La programmation orientée objet est un sur-ensemble de la programmation fonctionnelle ; une façon particulière de la structurer, de l’exploiter. Mais les règles de base demeurent les mêmes.
1. Les commentaires
Avant toute instruction et toute déclaration de variables, expliquons la notation des commentaires.
Les commentaires sont des annotations rédigées par celui qui programme. Ils facilitent la relecture et rappellent parfois le rôle de certaines variables ou de certains blocs d’instructions.
Le langage C++ connaît deux types de commentaires : les commentaires sur une seule ligne et ceux qui occupent plusieurs lignes.
Pour le premier type, on utilise la barre oblique redoublée. Le compilateur qui reconnaît cette séquence // ignore tout ce qui suit jusqu’à la fin de la ligne.
Le second type est délimité par les séquences /* et */, ce qui autorise l’annotation...
Tableaux
Les tableaux constituent, tout comme les variables, une structure très importante pour les algorithmes. Un tableau est un ensemble de valeurs d’un type déterminé. On accède à chaque valeur en communiquant au tableau un numéro que l’on appelle index. En C++, les index débutent à 0 et croissent jusqu’à N-1, où N est la taille du tableau, c’est-à-dire le nombre d’éléments qu’il contient.
Le type du tableau - en fait, le type des éléments qu’il contient - est quelconque : valeur scalaire, objet, pointeur... Voici deux exemples de tableaux :
double coord[2]; // un tableau de deux double coord[0] et coord[1]
char* dico[10000]; /* un tableau de 10000 pointeurs dico[0]
à dico[9999] */
Il est également possible de définir des tableaux multidimensionnels :
double matrice[3][3]; // une matrice, 2 dimensions
Pour initialiser un tableau, on peut accéder à chacun de ses éléments :
coord[0]=10;
coord[1]=15;
Il est également possible d’initialiser le tableau en extension, c’est-à-dire en fournissant ses valeurs au moment de la déclaration :
char separateurs[] = { ' ','*','-' };
Pour l’initialisation des tableaux de char, les littérales de chaînes rendent...
Fonctions et prototypes
Pour appréhender convenablement la programmation orientée objet, il est nécessaire de bien maîtriser la programmation fonctionnelle. Une fonction est un ensemble d’instructions - et parfois aussi de variables locales - auquel on a donné un nom. Cette fonction admet des paramètres et généralement évalue une valeur en retour.
Une fonction est donc modélisée par une boîte avec des entrées et une sortie :
![images/02ppn04.png](https://www.eni-training.com/download/c73a35ed-b3ca-4eb5-b278-9a245041bea1/images/02ppn04.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
La signature de la fonction définit son nom, ses paramètres d’entrée et sa sortie :
int somme(int a,int b)
Cette séquence précise que la fonction somme() reçoit deux paramètres de type entier a et b (entrée) et qu’elle retourne un entier. Pour l’instant, peu importe comment s’exécute la fonction, c’est-à-dire comment la somme est déterminée.
1. Déclaration d’une fonction
En C++, il faut déclarer une fonction avant de l’utiliser. Deux moyens sont prévus à cet effet : la définition complète et le prototype. La définition complète débute par la signature et se poursuit par la liste des instructions entre deux accolades :
int somme(int a,int b)
{
return a+b;
}
Dans l’approche par prototype, on termine la déclaration par un point-virgule.
int somme(int a,int b) ;
La signature et le corps de la fonction (donc la définition complète) peuvent ainsi figurer dans un autre fichier source d’extension .cpp. Le compilateur n’a pas besoin d’eux pour compiler, car le prototype le renseigne déjà sur la liste des paramètres et le type de retour. Au moment de l’édition des liens, « tous les morceaux sont recollés ».
Il n’est pas rare de regrouper tous les prototypes dans un fichier d’en-tête .h, et de fournir l’implémentation dans un fichier .cpp, ou bien sous forme d’une librairie statique .lib.
2. Fonctions et procédures
La même syntaxe est utilisée pour décrire ces deux éléments, alors que des langages tels que Basic (Function/Sub) ou Pascal (Function/Procedure) les distinguent. En C++, comme en C, on emploie le type...