1 Notions de base 1.1 Structure d'un programme Le langage C++ contient le langage C : tout programme écrit en C à la norme ANSI doit pouvoir être compilé par un compilateur C++. C++ fait la diérence entre Majuscules et minuscules : par exemple les variables Allo et allo sont distinctes En C++ on ne parle pas de type mais de classe (la classe int, la classe char...) En C++ on ne parle pas de variables mais d'objets ou d'instances (int i=0; déclare ou instancie un objet de classe int) Dans la pratique, sourtout pour les classes de base, on utilisera souvent la terminologie variable de type xx au lieu de objet (ou instance) de classe xx Programme C++ = ensemble de fonctions comprenant une seule fonction main() (point d'entrée). 1.2 Premières instructions Une instruction = la plus petite unité indépendante de C++, délimitée par un ; (point virgule) une phrase du langage naturel. #include <stdlib.h> #include <iostream> int main(void) { int age = 21; //reservation memoire pour age float x[5]={1.0,0,0,2,-1.5}; /* Autre commentaire */ char Nom[25]="Etudiant", prenom[20] = "Lambda"; float note_partiel, note_exam, note_finale; note_partiel = note_exam = note_finale = 0.0; 1
} //C'est l'initialisation! cout << endl << "entrer notes part et exam"; cin >> note_partiel >> note_exam; note_finale = 0.3*note_partiel + 0.7*note_exam;//affectation cout << note_finale; 1.3 Compilation Pour pouvoir etre utilisé, un programme doit etre compilé : Compilation par l'instruction > g++ -c gourette.cxx 1. Appelle cpp (C pré-processeur) pour traiter les lignes commençant par #. Production d'un chier texte temporaire tmp.c 2. Appelle gcc (compilateur) pour traduction de tmp.c en langage machine. Production d'un chier objet gourette.o Edition des liens (link) > g++ gourette.o -o artouste edition des liens entre gourette.o et les diérentes bibliothèques système ou autre utilisées (implicitement ou explicitement). Production d'un exécutable artouste Raccourci : compilation + édition des liens > g++ gourette.cxx -o artouste Exécution > artouste 2
1.4 Compilation séparée Ces fonctions peuvent (doivent) être réparties dans plusieurs chiers ; par exemple chier main.cxx #include <stdlib.h> #include util.h int main() { int i=doubler(3); double x = tripler(0.0);//etc... } chier util.h #ifndef UTIL_H #define UTIL_H void doubler(int); void tripler(float); Compilation g++ -c main.cxx util.cxx Edition des liens (link) g++ main.o util.o -o mon_prog #endif Raccourci : compilation + édition des liens g++ main.cxx util.cxx -o mon_prog chier util.cxx #include util.h //ici des utilitaires et //fonctions utilisés par main() void tripler(int y) { cout<<endl<<3*y; y=3*y; }; double doubler(float x) { x*=2; }; 1.5 Syntaxe, éléments de base C++ fait la diérence entre Majuscules et minuscules : par exemple les variables Allo et allo sont distinctes Identicateurs : noms et types de variables, noms de fonctions, nom des constantes, nom des macros-instructions Mots réservés : jeu de mots clés du langage Constantes : Opérateurs : +,*,-,/,% etc... Séparateurs : caractères spéciaux (espace, tabulation,cr/lf..) ; terminaison d'instruction ou de déclaration, séparation d'éléments () liste d'arguments ou de paramètres [] dimension ou indice d'un tableau {} bloc d'instructions, liste ou initialisation de tableau Commentaires : /* ceci est un commentaire (les commentaires imbriqués sont interdits)*/ Commentaires : // ceci est un autre commentaire 3
1.6 Variables caractérisées par : un nom un type une classe de stockage (précise la durée de vie, la visibilité, et l'emplacement mémoire) le nom : Séquence de chires et de lettres Premièr caractère = caractère alphabétique _ (underscore) est une lettre 1.7 Mots réservés Types : int, char, short, long, double, float, unsigned, struct, enum, union, void, signed Classe de stockage : auto, extern, static, register, typedef, const, volatile Instructions : if, else, while, do, for, switch, break, continue, goto, return Opérateurs : sizeof Etiquette : case, default mots réservés C++ : new, asm, friend, virtual, class, catch, delete, inline, operator, private, protected, public, template, this, throw, try. diérencie majuscule et minuscule les 32 premiers caractères sont signicatifs les mots clés ou réservés sont interdits 4
1.8 Constantes chiffres 1.9 Constantes de type caractère 1. caractère : encadré par deux apostrophes (`) exemple `a' type exemple 2. caractère non imprimable ou séquence d'échappements : entier décimal séquence de chires ne commençant pas par 0 125 entier octal séquence de chires commençant par 0 016 newline `\n' entier hexadécimal séquence de digits commençant par 0x ou 0X 0xFFA33 tabulation `\t' entier long séquence de digits nissant par l ou L 1450L backspace `\b' réel (double précision) séquence de chires en notation décimale 1.25 antislash `\\' séquence de chires en notation scientique 1.2E+3 NULL `\0' réel (long double) réel, nissant par l ou L 1.78L 3. chaîne de caractères : séquence de caractères délimitée par des guillemets (double cote) ex : "ceci est une chaine \n" Une chaine de caractères se termine par le caractère NULL '\0' ajouté par le compilateur. Une chaîne de caractères est un tableau de type caractères à 1 dimension. 5
1.10 Types types de base : char caractère (un seul caractère) int entier float réel, ottant double double précision modicateurs : short, long, signed, unsigned tailles : dépend de la machine. Pour le compilateur gcc (linux), on a (voir chiers limits.h et oat.h) #include <iostream> using namespace std; int main(void) { unsigned int ui=0; cout <<endl<<--ui; int i=0; cout <<endl<<--i; } $ g++ unsigned.cxx $./a.out 4294967295-1 Type Taille (bits/octets) valeurs unsigned char 8 0... 255 char 8-128... 127 short int 16-32768... 32767 int/long 32-2147483648... 2147483647 unsigned int/long 32 0... 4294967295 float 32/4 1.18e-38... 3.40e+38 double 68 2.23e-308... 1.80e+308 long double? L'usage du modicateur unsignedest vivement déconseillé pour les indices de tableaux. Exemple : 6
1.11 Conversions de type conversions automatiques règle de base : après évaluation, le type du résultat est celui de l'opérande de type le plus élevé. exemple : int i; double x; x = x+i; //i est converti (promu) en double. La hiérarchie des types est la suivante : char,short > int > unsigned > long > double > long double < float conversions explicites (cast) pour forcer ou empêcher une conversion syntaxe : (type) expression exemple : x = sqrt ((double) 23); 1.12 Déclarations de variables Toute variable doit être déclarée avant son utilisation. déclaration : permet au reste du programme de connaître l'existence et les propriétés de la variable. allocation : réserve et alloue une place en mémoire (à la compilation ou à l'exécution). la classe de stockage : détermine l'emplacement en mémoire et la durée de vie d'une variable. Elle est déduite de la déclaration et de l'emplacement de la déclaration. syntaxe : type nom (initialisation) exemple : int i(12); extern double x ; long double vect [] = {1.0L, 1.0L, 2.1L, 0.0L}; 7
1.13 Portée d'une variable la portée d'une variable est la région du programme où elle est connue. Elle dépend du mode et du lieu de sa déclaration : portée chier ou portée globale : variables déclarées en début de chier hors des blocs. Elles sont connues de leur point de déclaration à la n du chier. portée prototype de fonction : variables déclarées et connues entre le nom de la fonction et le début du bloc des instructions. Ce sont les arguments de la fonction. Par exemple : int max (int a, int b); portée bloc ou portée locale : commence à son point de déclaration et se termine à la n du bloc englobant la déclaration. 1.14 Durée de vie d'une variable En relation étroite avec la classe de stockage. durée de vie statique : mémoire allouée en début d'exécution, dure jusqu'à la n d'exécution du programme. Ce sont les variables à portée chier et les variables déclarées extern ou static. Elles sont initialisées à 0. Par défaut, une variable à portée chier a la classe extern. portée fonction : ce sont les étiquettes ou labels. Leur portée s'étend du début à la n de la fonction. durée de vie locale : de ce type. la plupart des variables que vous utiliserez sont mémoire allouée à l'entrée dans un bloc ou une fonction, désallouée à la sortie du bloc ou de la fonction. On parle aussi de variables automatiques. Ce sont les variables à portée bloc et les variables déclarées auto ou register (registre à accès rapide; par exemple les indices de boucles). Elles ne sont pas initialisés automatiquement. Par défaut les variables déclarées dans un bloc ont la classe auto. 8
durée de vie dynamique : variables créées et détruites par l'utilisateur. (L'allocation se fait par les fonctions de la famille malloc()la destruction par free()) ou bien par les opérateurs new() et delete() 1.15 Récapitulatif, variables globales classe de stockage extern extern static portée chier autres chiers chier instant d'allocation compilation aucune compilation zone mémoire données données durée de vie le programme le programme initialisation autorisée interdite autorisée 1.16 Récapitulatif, variables locales classe de stockage extern static auto register portée bloc bloc bloc bloc instant d'allocation aucune compilation entrée dans le bloc entrée dans le bloc zone mémoire données pile un registre durée de vie le programme bloc bloc initialisation interdite autorisée, autorisée 0 par défaut sauf tableaux autorisée 9
1.17 Tableaux déclaration : type nom [taille][...] exemple : double mat [10][2]; les indices varient de 0 à taille-1. Pour un tableau multidimensionnel, seule la dernière dimension n'a pas besoin d'être précisée. pas de contrôle eectué par le compilateur sur les références hors limites. Initialisation : par exemple int indice[5]={4, 8, 1, 2, 9}; dans ce cas il n'est pas nécessaire d'indiquer la dimension (n=5). Un tableau estun pointeur : dans double x [100]; x est un pointeur sur un double. Les tableaux peuvent être alloués dynamiquement grâce à la fonction : void *malloc(size_t size) de la bibliothèque standard <stdlib.h> (déconseillé) et aussi par l'opérateur new(): double*x=new double[10] déclare et alloue un tableau x de 10 réels (à privilégier par rapport à la fonction malloc) 10