//img.uscri.be/pth/9f8486227c174fac9c3cf1085419206642d93df5
La lecture en ligne est gratuite
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres
Télécharger Lire

Cours C++.livre(Hello.C)

De
22 pages
CHAPITRE 4 Une rapide introduction à C++Nous allons, dans le présent chapitre, très brièvement aborder les aspects lesplus élémentaires du langage, et donner, sans autre explication, les éléments debase du langage. Nous reviendrons plus tard, en détail, sur les divers points parti-culiers. L’important ici est de nous donner les moyens de programmer quelquesexemples simples, sans avoir à assimiler au préalable tous les détails du langage.Le langage C++ 25einev Télécommunications mjn 4.1 Un exemple simpleVoyons tout d'abord, sur la base d'un exemple très simple, les principales phases de dé-veloppement d'un programme C++, et examinons brièvement les différences par rapport à C.Notre exemple de développement se base sur une machine UNIX de Hewlett-Packard (sérieHP 9000).// Exemple C++#include// Bibliothèque d'entrées-sorties C++// iostream remplace stdiovoid direCoucou(){cout<<“Coucou”<
Voir plus Voir moins
CHAPITRE 4
Une rapide introduction à C++
Nous allons, dans le présent chapitre, très brièvement aborder les aspects les plus élémentaires du langage, et donner, sans autre explication, les éléments de base du langage. Nous reviendrons plus tard, en détail, sur les divers points parti-culiers. L’important ici est de nous donner les moyens de programmer quelques exemples simples, sans avoir à assimiler au préalable tous les détails du langage.
Le langage C++
25
einev
4.1 Un exemple simple
Télécommunications
mjn
Voyons tout d'abord, sur la base d'un exemple très simple, les principales phases de dé-veloppement d'un programme C++, et examinons brièvement les différences par rapport à C. Notre exemple de développement se base sur une machine UNIX de Hewlett-Packard (série HP 9000).
// Exemple C++ #include<iostream.h> // Bibliothèque d'entrées-sorties C++ // iostream remplace stdio void direCoucou() { cout<<Coucou”<<endl; } int main(int argc, char *argv[]) { cout<<"Quoi de neuf docteur ?"<<endl; direCoucou() return 0; } Appelons ce fichier "hello.C", et compilons ce fichier. Le suffixe ".C" ou ".cpp" est re-connu par le compilateur de HP. Attention! le compilateur C++ sous HP/UX requiert le suf-fixe.C majuscule ou.cpp minuscule. D'autres compilateurs utilisent, par défaut, le suffixe ".CC", ".cc", ".cpp", etc... L'extension ".cpp" est souvent rencontrée dans le monde Windows, où les lettres majuscules sont équivalentes aux lettres minuscules. Pour les fichiers #inclu-de , l'extension ".h" s’est généralisée (surtout grâce aux efforts de ANSI), encore que l'on ren-contre quelquefois ".hpp". $ CC -o hello hello.C $ hello Quoi de neuf, docteur ? La commande CC (par analogie à cc) appelle le compilateur C++ (ou le préprocesseur, suivant les implémentations, qui générera du code C et appellera ensuite cc). Le résultat est un module objet relogeable (hello.o), qui est passé à l'éditeur de liens (sous UNIX, ld) qui va se charger de faire un module exécutable nommé hello. Pour ceux qui travaillent dans un environnement de type GNU (linux ou cygwin), le compilateur se nomme g++. Les environnements de type Visual C++ dissimulent souvent le nom de l’exécutable implémentant le compilateur sous une entrée de menu quelconque, ce qui peut s’avérer extrêmement gênant dans certains cas. Ce segment de programme appelle quelques commentaires, par rapport à une implé-mentation en C donnée ci-dessous : /* Exemple C */ #include <stdio.h> 26 Le langage C++
einev
Télécommunications
mjn
/* Bibliothèque d'entrées-sorties C */ int main(int argc, char *argv[]) { printf(stdout, "Quoi de neuf docteur ?\n"); return 0; } Le style de commentaires en C++ a changé. Les anciens commentaires C pourraient être utilisés, néanmoins. Les instructions permettant d'afficher sur la sortie standard a changé. Au lieu de stdout, on utilise cout, et la sortie ne se fait pas au moyen d'une fonction à laquelle on passe une liste de paramètres, mais au moyen de l'opérateur <<. Par analogie, on remplacerait stdin par cin, et scanf par l'opérateur >>, comme dans :
int anInt; cin>>anInt; Revenons un peu plus en détail sur les diverses composantes d’un programme C++. Le programme C++ est formé de Directives à l’usage du préprocesseur (Voir Le préprocesseur , page47.). Ainsi #include <iostream.h> est une directive disant au préprocesseur de lire le fichier iostream.h avant de traiter le reste du fichier source. Fonctions de librairie. Dans le deuxième exemple, écrit en C classique, printf() est une fonction dont la définition et l’implémentation sont fournies avec le compilateur. Fonctions utilisateur (Voir Fonctions , page131.). Ainsi, direCoucou() est une fonc-tion implémentée par l’utilisateur, qui peut être appelée par une autre fonction, ou par le programme principal. Notons que le corps de la procédure est inclus entre les parenthèses { et } (appelées «lazy brackets»). Ces parenthèses (Voir Instructions composées , page125.) correspondent d’une certaine manière au BEGIN...END de PASCAL. Variables, constantes, etc... Notre exemple ne comporte pas de variables. C++ permet de définir des constantes, des variables de divers types, et également de créer de nouveaux types de données au besoin. Opérateurs (Voir Opérateurs C++ , page157.). << est un opérateur défini par la librairie C++ iostream. Les opérateurs, contrairement à des langages de type PASCAL, par exem-ple, peuvent être redéfinis en C++. Un programme principal, identifié par l’identificateur main(). L’identificateur main() définit le point d’entrée du programme, ou point à partir duquel commencera l’exécution du programme. Le corps de ce programme est défini dans un bloc délimité par des accola-des (Voir Instructions composées , page125.) {}.
Le langage C++
27
einev
Télécommunications
4.2 La notion de librairie avec  stdio et iostream
mjn
Dans notre petit exemple, nous avons utilisé le préprocesseur pour inclure un autre fi-chier (iostream.h) dans notre fichier source. Ce fichier est appelé un fichier en-tête ( header file ) et correspond, par les buts poursuivis, à une spécification en Ada. Ce fichier définit le contenu d’une librairie de code objet qui sera inclue au code compilé lors de l’édition de liens du programme. Les librairies jouent un rôle très important an C et en C++: il est pratiquement impossible d’écrire un programme C sans utiliser une librairie. stdio et iostream sont les plus connues parmi ces librairies. Elles permettent d’effectuer des entrées-sorties sur une con-sole alphanumérique, ou sur disque. Les habitués de C utiliseront de préférence <stdio.h> , mieux connu, alors que les no-vices utiliseront plus facilement la nouvelle librairie <iostream.h> , uniquement utilisable en C++. Quelle est la meilleure méthode ? Dans le cadre des exercices (du moins la majorité d’entre eux) présentés dans le cadre de ce cours, le but de l’utilisation de ces deux librairies est le même, c’est-à-dire l’écriture des résultats du programme réalisé sur une console alphanumérique, ou plus souvent dans une fe-nêtre faisant office de console. Pour ce but, les deux librairies peuvent être utilisées indiffé-remment : elles produiront les mêmes résultats, et parfois stdio.h apparaîtra plus facile à utiliser, notamment pour formatter les sorties de nombres réels. En réalité, dans le cadre du développement industriel, il n’y plus guère de cas où l’uti-lisation de ces deux librairies se justifie pour des entrées / sorties alphanumériques, tant il est vrai qu’un logiciel se doit impérativement actuellement de fournir un interface graphique avec des fenêtres, des boutons, etc... même s’ils n’ajoutent rien au confort d’utilisation du program-me 1 (parfois, ce confort peut s’en trouver franchement dégradé en raison d’une lenteur into-lérable du système de fenêtrage sous-jacent ... changeons d’ordinateur!). En pratique, ni stdio , ni iostream ne seront utilisés pour des entrées-sorties utilisateur, ce qui fait que l’utilisation de l’une ou de l’autre est relativement indifférente. Les possibilités supplémentai-res de iostream ne sont dans ce cas, que de peu d’utilité pratique. Il n’en va pas de même dans le cas d’entrées-sorties sur fichier. Les deux librairies sont capables des mêmes opérations élémentaires sur des fichiers, mais les fonctionnalités de iostream peuvent être étendues quasiment à l’infini par le biais du mécanisme d’héritage propre à C++. Il vaut donc mieux utiliser cette librairie pour le travail sur des fichiers. Par ex-tension, on peut en déduire qu’il est préférable d’utiliser iostream dans tous les cas, de ma-nière à ne pas avoir deux librairies à mémoriser, et surtout pour éviter tout conflit potentiel entre ces deux librairies.
1. Qui n’a jamais cherché une fonction sous une cascade indigeste de menus alors que le nom de la fonction était parfaite-ment clair ? 28
Le langage C++
einev
Télécommunications
mjn
4.2.1 Utilisation de stdio pour la lecture d’un nombre entier Lire un nombre entier sur la console à partir d’un programme est un problème courant dans le cadre des exercices proposés. Voyons un exemple en C, utilisant stdio.h :
int main(int , char**) { int entier; printf("Entrer un nombre entier : "); /* Pas de panique ! nous verrons plus tard a quoi correspond en realite le caractere & dans ce contexte. Disons qu'il sert a calculer l'adresse d'une variable. */ scanf("%d", &entier); printf("\nL'entier vaut %d\n", entier); return 0; } D’une manière générale, la syntaxe de printf est : printf(“Chaîne de caractères de contrôle”, variables); FIGURE 1. printf()
int VAR1, VAR2; VAR1 = 1; VAR2 = 4;
printf( “Impression de VAR1 : %d et de VAR2 : %d” , VAR1, VAR2)
Chaîne de contrôle
Il est possible de diriger la sortie vers un autre fichier que le fichier de sortie standard, stdout. En ce cas, la syntaxe sera : printf(outputFile, “Chaîne de contrôle”, liste de variables); De manière similaire, il est possible de lire des entrées en provenance d’autres fichiers que stdin. On aura alors :
Le langage C++
29
einev
Télécommunications
mjn
scanf(inputFile, “Chaîne de contrôle”, liste d’adresses de variables);
4.2.2 Descripteurs de formats de printf() Le caractère cabalistique %d rencontré dans la chaîne de contrôle de printf() indique qu’il va falloir substituer à cette chaîne un entier sous forme décimale. Il s’agit d’un descrip-teur de format . Ces descripteurs de format sont introduits par le caractère % qui joue le rôle de caractère d’échappement. Les descripteurs possibles sont énumérés dans la Figure 2 , page30. FIGURE 2. descripteurs de format
Descripteur Explication %d Affichage d’une valeur entière en base 10 %i Identique à %d %c Affichage d’un caractère %f Affichage d’une valeur réelle %e Affichage d’une valeur réelle en notation scientifique %E Affichage d’une valeur réelle en notation scientifique, avec l’exposant noté E %g Choix automatique entre f et e %G Comme g, mais avec un E pour l’exposant, dans la mesure où cela s’avère necessaire %s Chaîne de caractères %u Valeur entière non signée %o Valeur entière en octal %x Valeur entière affichée en hexadécimal %X Comme x, mais avec lettres majuscules %% Permet d’afficher le caractère % Il est également possible de préciser la dimension du champ : int uneValeur; uneValeur = 10; printf(“Valeur = <%10d>”, uneValeur); affichera la valeur 10 dans un champ de 10 de long, soit précédé de 8 espaces : Valeur = < 10> Pour des valeurs réelles, on peut de plus préciser le nombre de chiffres après la virgule : float unReel; unReel = 3.1415926; printf(“Valeur = <%10.3f>”, unReel);
30
Le langage C++
einev
Télécommunications
mjn
affichera 3 chiffres après la virgule dans un champ de largeur 10. N’oublions pas le point décimal dans le calcul de la largeur du champ nécessaire !
Valeur = < 3.142>
4.2.3 Utilisation de iostream pour la lecture d’un nombre entier
iostream permet la même opération, de manière peut-être un peu plus simple : #include <iostream.h> int main(int , char**) { int entier; cout<<"Entrer un entier : "; // le caractere & sert a calculer l'adresse // d'une variable. // Remarquer l'opérateur >> : cin>>entier; cout<<endl<<"L'entier vaut "<<entier<<endl; return 0; }
Le langage C++
31
einev
Télécommunications
4.3 Le langage en un clin d’ eil o
mjn
Jetons un bref coup d’oeil sur les différents éléments constitutifs du langage. Cette énu-mération nous servira à mieux comprendre les exemples, de manière à être rapidement en me-sure d’effectuer des exercices simples en C. Nous reviendrons, par la suite, sur les divers aspects du langage. Ce chapitre pourra également servir de petit aperçu du langage.
4.3.1 Directives du préprocesseur Les directives du préprocesseur sont identifiées par le signe # placé dans la première co-lonne. Directive Utilisation #define Définit une macro, ou un identificateur de préprocesseur #else Alternative à la clause #if #endif Fin d’une clause #if ou #else, si cette dernière existe #error Permet d’afficher un message (typiquement, une erreur) sur stderr au moment de la compilation #ifdef Test si un identificateur est défini #ifndef Test si un identificateur n’est pas défini #include Inclusion d’un fichier (par exemple .h) #line Modification de variables prédéfinies ( LINE et __ __ __ __ FILE ) #pragma Définit un comportement spécifique du préprocesseur #undef Annule une définition précedemment faite au moyen de #de-fine Le préprocesseur définit également quelques variables (appelées variables prédéfinies). En fait, chaque version de préprocesseur introduit un jeu de variables plus ou moins proprié-taires. Les quelques variables suivantes sont en principe implémentées dans toutes les versions sérieuses de C++ : Identificateur Utilisation LINE Numéro de la ligne courante __ __ __ __ FILE Nom du fichier source courant __ __ DATE Date actuelle, sous forme de chaîne de caractères TIME Heure actuelle, sous forme de chaîne de caractères __ __ cplusplus est défini si le compilateur est un compilateur C++ __
32
Le langage C++
einev
Télécommunications
4.3.2 Mots réservés Les mots reservés définis uniquement pour C++ sont signalés en gras. Mot réservé C++ asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long namespace new operator private protected public register
Le langage C++
mjn
Utilisation Directive de compilation: les instructions comprises dans le bloc asm {} sont en langage assembleur Directive de compilation pour l'allocation de variables Rupture de séquence d'éxécution Utilisé en conjonction avec le branchement conditionnel switch Exceptions, en conjonction avec try, throw Type caractère Classe C++ Déclaration de valeur constante Continuation dans une séquence d'instructions Utilisé en conjonction avec switch, si la valeur ne cor-respond à aucune étiquette case Libération de place mémoire Boucle do..while Nombres virgule flottante en double précision if...else Type énuméré Signale une valeur connue à l'extérieur du contexte du mo-dule de compilation considéré Nombres virgule flottante en simple précision Boucle for Fonction "amie" d'une classe Instruction inutile Test logique classique Fonction inline. Instruit le compilateur de ne pas générer un appel de procédure, mais de recopier le code. Type entier Type long entier Définition d’un espace de dénomination d’identificateurs Opérateur d'allocation mémoire Déclaration d'un opérateur Membre de classe privé Membre de classe protégé Membre de classe public Directive de compilation assignant la variable considérée à un registre plutôt qu'une place mémoire
33
einev
Télécommunications
mjn
Mot réservé C++ Utilisation return Retour de fonction short Entier court signed Type muni d'une indication de signe sizeof Opérateur de calcul de taille en bytes static Signale une valeur non connue à l'extérieur du contexte du module de compilation considéré, ou à l'extérieur de la procédure considérée struct Définition d'une structure switch Branchement conditionnel (CASE OF...) template Déclaration d'un modèle de fonction ou de classe this A l'intérieur d'un classe, fournit un pointeur sur l'ins-tance active throw Traitement d'exceptions try Traitement d'exceptions typedef Définition d'un synonyme de type union Définition d'une structure à variantes unsigned Type non signé using Utilisation d’un espace de dénomination virtual Membre virtuel, pouvant être redéfini par une classe dé-rivée void Non typé volatile Directive de compilation signalant au compilateur que la variable en question peu être modifiée en dehors du con-trôle du programme while Boucle while {}, do {} while 4.3.3 Opérateurs Le niveau indique la précédence : plus le niveau est haut, plus la précédence de l’opéra-teur est grande. La lettre qui suit l’indication de précédence indique l’associativité (L = left, R = right).  
Niveau Opéra- Fonction teur 17R :: Sélection de contexte global 17L :: Sélection de contexte de classe 16L ->, . Sélecteurs de membres 16L [] Index de tableau 16L () Appel de fonction 16L () Construction de type 34 Le langage C++
einev
15R 15R 15R 15R 15R 15R 15R 15R 14L 13L 12L 11L 10L 9L 8L 7L 6L 5L 4L 3L 2R
Télécommunications
mjn
sizeof Taille en bytes ++, -- Incrémentation, décrémentation ~ NOT binaire, bit à bit ! NOT logique +, - Signe plus, moins *, & Déréférence de pointeur, opérateur addresse () Conversion de type, casting new, Gestion de mémoire delete ->*, .* Sélecteurs de pointeurs de membres *, /, % Opérateurs multiplication, division, modulo +, - Opérateurs arithmétiques <<, >> Décalage bit à bit <, <=, Opérateurs relationnels >, >= ==, != Egalité, Inégalité & AND bit à bit ^ XOR bit à bit | OR bit à bit && AND logique || OU logique ?: IF arithmétique =, *=, Opérateurs d'assignation /=, %=, +=, -=, <<=, >>=, &=, |=, = ^ 1L , Opérateur virgule 4.3.4 Librairie iostream La librairie iostream est la librairie d’entrées-sorties pour C++. Cette librairie est com-plexe, et utilise abondamment les techniques d’héritage et de surdéfinition d’opérateurs of-fertes par C++. Pour l’instant, il nous suffit de savoir comment afficher quelque chose sur l’écran, et comment lire une valeur depuis le clavier. Il existe deux flots ( streams ) importants qui sont cout et cin , équivalents de stdout (sortie standard, standard output ) et stdin (entrée standard, standard input ) respectivement.
Le langage C++
35