Les commentaires Entres/sorties avec cin , cout et cerr Intrts de cin , cout et cerr Les manipulateurs Les conversions explicites Dfinition de variables Variable de boucle Visibilit des variables Les constantes Constantes et pointeurs Les types composs Variables rfrences Allocation mmoire
LES COMMENTAIRES
Le langage C++ offre un nouvelle faon dajouter des commentaires. En plus des symboles /* et */ utiliss en C, le langage C++ offre les symboles // qui permettent dignorer tout jusqu la fin de la ligne. Exemple :
/* commentaire traditionnel sur plusieurs lignes valide en C et C++ */ void main() { // commentaire de fin de ligne valide en C++ #if 0 // une partie dun programme en C ou C++ peut toujours
// tre ignore par les directives au prprocesseur // #if .... #endif #endif }
Il est prfrable dutiliser les symboles // pour la plupart des commentaires et de nutiliser les commentaires C ( /* */ ) que pour isoler des blocs importants dinstructions.
} /* rsultat de lexcution i=123 f=1234.57 ch=Bonjour i = ? 12 f = ? 34.5 rep = ? y ch = ? c++ is easy ch= c++ */
tout comme pour la fonction scanf, les espaces sont considrs comme des sparateurs entre les donnes par le flux cin. notez labsence de loprateur & dans la syntaxe du cin. Ce dernier na pas besoin de connatre ladresse de la variable lire.
taille mmoire rduite : seul le code ncessaire est mis par le compilateur, alors que pour, par exemple printf , tout le code correspondant toutes les possibilits daffichage est mis. on peut utiliser les flux avec les types utilisateurs (surcharge possible des oprateurs >> et <<).
LES MANIPULATEURS
Les manipulateurs sont des lments qui modifient la faon dont les lments sont lus ou crits dans le flot. Les principaux manipulateurs sont : dec oct hex endl setw(int n) setprecision(int n) setfill(char) flush Exemple :
#include <iostream.h> #include <iomanip.h> void main() { int i=1234; float p=12.3456; cout << << << << "|" << setw(8) << setfill(*) hex << i << "|\n" << "|" setw(6) << setprecision(4) p << "|" << endl;
lecture/criture dun entier en dcimal lecture/criture dun entier en octal lecture/criture dun entier en hexadcimal insre un saut de ligne et vide les tampons affichage de n caractres affichage de la valeur avec n chiffres avec ventuellement un arrondi de la valeur dfinit le caractre de remplissage vide les tampons aprs criture
Le C++ offre aussi une notation fonctionnelle pour faire une conversion explicite de type :
Cette faon de faire ne marche que pour les types simples et les types utilisateurs. Pour les types pointeurs ou tableaux le problme peut tre rsolu en dfinissant un nouveau type :
double d; int *i; typedef int *ptr_int; i = ptr_int(&d);
La conversion explicite de type est surtout utile lorsquon travaille avec des pointeurs du type void * .
DEFINITION DE VARIABLES
En C++ vous pouvez dclarer les variables ou fonctions nimporte o dans le code. La porte de telles variables va de lendroit de la dclaration jusqu la fin du bloc courant. Ceci permet de dfinir une variable aussi prs que possible de son utilisation afin damliorer la lisibilit. Cest particulirement utile pour des grosses fonctions ayant beaucoup de variables locales. Exemple :
#include <stdio.hlgt; void main() { int i=0; // dfinition dune variable i++; // instruction int j=1; // dfinition dune autre variable j++; // instruction int somme(int n1, int n2); // dclaration dune fonction printf("%d+%d=%d\n", i, j, somme(i, j)); // instruction }
VARIABLE DE BOUCLE
On peut dclarer une variable de boucle directement dans linstruction for. Ceci permet de nutiliser cette variable que dans le bloc de la boucle. Exemple :
#include <iostream.h> void main() { for(int i=0; i<10; i++) cout << i << ; // i nest pas utilisable lextrieur du bloc for } /* rsultat de lexcution 0 1 2 3 4 5 6 7 8 9 */
Lutilisation abusive de cette technique nest pas une bonne pratique de programmation (lisibilit). Il est prfrable de donner des noms diffrents plutt que de rutiliser les mmes noms.
En fait, on utilise beaucoup cet oprateur pour dfinir hors dune classe les fonctions membres.
LES CONSTANTES
Les habitus du C ont lhabitude dutiliser la directive du prprocesseur #define pour dfinir des constantes. Il est reconnu que lutilisation du prprocesseur est une source derreurs difficiles dtecter. En C++, lutilisation du prprocesseur se limite aux cas les plus srs : inclusion de fichiers compilation conditionnelle. Le mot rserv const permet de dfinir une constante. Lobjet ainsi spcifi ne pourra pas tre modifi durant toute sa dure de vie. Il est indispensable dinitialiser la constante au moment de sa dfinition. Exemple :
const int N = 10; // N est un entier constant. const int MOIS=12, AN=1995; // 2 constantes entires int tab[2 * N]; // autoris en C++ (interdit en C)
CONSTANTES ET POINTEURS
Il faut distinguer ce qui est point du pointeur lui mme. La donne pointe est constante :
const char *ptr1 = "QWERTY"; ptr1++; // autoris *ptr1 = A; // ERROR: assignment to const type
VARIABLES REFERENCES
En plus des variables normales et des pointeurs, le C++ offre les variables rfrences. Une variable rfrence permet de crer une variable qui est un "synonyme" dune autre. Ds lors, une modification de lune affectera le contenu de lautre.
int i; int & ir = i; // ir est une rfrence i int *ptr; i=1; cout << "i= " << i << " ir= " << ir << endl; // affichage de : i= 1 ir= 1 ir=2; cout << "i= " << i << " ir= " << ir << endl; // affichage de : i= 2 ir= 2 ptr = &ir; *ptr = 3; cout << "i= " << i << " ir= " << ir << endl; // affichage de : i= 3 ir= 3
Une variable rfrence doit tre initialise et le type de lobjet initial doit tre le mme que lobjet rfrence. Intrt : passage des paramtres par rfrence utilisation dune fonction en lvalue
ALLOCATION MEMOIRE
Le C++ met la disposition du programmeur deux oprateurs new et delete pour remplacer respectivement les fonctions malloc et free (bien quil soit toujours possible de les utiliser).
Loprateur new Loprateur new rserve lespace mmoire quon lui demande et linitialise. Il retourne soit ladresse de dbut de la zone mmoire alloue, soit 0 si lopration choue.
int *ptr1, *ptr2, *ptr3; // allocation dynamique dun entier ptr1 = new int; // allocation dun tableau de 10 entiers ptr2 = new int [10];
// allocation dun entier avec initialisation ptr3 = new int(10); struct date {int jour, mois, an; }; date *ptr4, *ptr5, *ptr6, d = {25, 4, 1952}; // allocation dynamique dune structure ptr4 = new date; // allocation dynamique dun tableau de structure ptr5 = new date[10]; // allocation dynamique dune structure avec initialisation ptr6 = new date(d);
Loprateur delete Loprateur delete libre lespace mmoire allou par new un seul objet, tandis que loprateur delete[] libre lespace mmoire allou un tableau dobjets.
// libration dun entier delete ptr1; // libration dun tableau dentier delete[] ptr2;
Lapplication de loprateur delete un pointeur nul est lgale et nentraine aucune consquence facheuse (lopration est tout simplement ignore).
A chaque instruction new doit correspondre une instruction delete. Il est important de librer lespace mmoire ds que celui ci nest plus ncessaire. La mmoire alloue en cours de programme sera libre automatiquement la fin du programme.
La fonction set_new_handler Si une allocation mmoire par new choue, une fonction derreur utilisateur peut tre appele. La fonction set_new_handler , dclare dans new.h, permet de dsactiver la procdure standard (qui est de renvoyer zro) et dappeler votre fonction derreur.
#include <iostream.h> #include <stdlib.h> // exit() #include <new.h> // set_new_handler() // fonction derreur dallocation mmoire dynamique void erreur_memoire( void) {
cerr << "\nLa mmoire disponible est insuffisante !!!" << endl; exit(1); } void main() { set_new_handler( erreur_memoire ); double *tab = new double [1000000000]; set_new_handler(0); // ractive la fonction derreur standard }