Sunteți pe pagina 1din 193

Cours de C++

Fran cois Laroussinie


Dept. dInformatique, ENS de Cachan

2 novembre 2005

Premi` ere partie I Introduction

Introduction

Introduction

Algorithme et programmation

Algorithme: m ethode pour r esoudre un probl` eme Pour un probl` eme donn e, il peut y avoir plusieurs algorithmes. . . ou aucun ! NB: pour la plupart des probl` emes int eressants, il nexiste pas dalgorithme (ni aujourdhui, ni demain !) Dans les probl` emes qui restent, la grande majorit e ont des algorithmes beaucoup trop durs pour etre utilis es ! On cherche des algorithmes simples, ecaces, el egants. . . Programme: . . . sadresse ` a une machine !

Introduction

Le langage C++

D ebut en 1983. Am elioration du langage C: Abstraction de donn ees Programmation orient ee objet Programmation g en erique tr` es utilis e!

Introduction

Programmer

Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . .

Introduction

Programmer

Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++)

Introduction

Programmer

Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++) 3. Ex ecuter le programme

Introduction

Programmer

Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++) 3. Ex ecuter le programme ... 4. TESTER et DEBUGGER : retour au point 1 ! C a peut durer assez longtemps...

Introduction

Un exemple
Lin evitable hello world:
#i n c l u d e < i o s t r e a m > u s i n g namespace s t d ; i n t main ( ) { c o u t << h e l l o w o r l d ! << e n d l ; }

D emo...

Deuxi` eme partie II Structures de base du C++

Plan

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Plan

Programmation

Les briques de base du langage: Ce qui permet de stocker des donn ees: types, variables, tableaux, etc. Les expressions qui permettent de manipuler les donn ees. Les instructions pour construire les algorithmes.

Types, variables...

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Types, variables...

Types el ementaires

int : entiers (au min 16 bits, pour des valeurs 32767) (dautres formats existent: long int (min 32 bits), short int, unsigned int) . . . (float), double et long double : nombres ` a virgule ottante (en g en eral 15 chires sign. pour double). Par ex. 23.3 ou 2.456e 12 ou 23.56e 4 char : caract` eres (a,b,. . . A,. . . ,:,. . . ). bool : bool eens (true ou false). (Et: 0 false ; tout entier non nul equivaut ` a false) (Et aussi: des types particuliers pour les tailles de tableaux, de cha nes de caract` eres, dobjets etc. size t, ::size type)

Types, variables...

D enition de variable
Syntaxe : type v ; int p ; double x ; Toute variable doit etre d enie avant d etre utilis ee ! Une d enition peut appara tre nimporte o` u dans un programme. Une variable est d enie jusqu` a la n de la premi` ere instruction ee par }) qui contient sa d enition. compos ee (marqu (Une variable d enie en dehors de toute fonction et de tout espace de nom est une variable globale).

Types, variables...

D enition de variable

Une variable peut etre initialis ee lors de sa d eclaration, deux notations sont possibles : int p=34 ; double x=12.34 ; int p (34) ; double x (12.34) ;

Une variable dun type el ementaire qui nest pas initialis ee, na pas de valeur d enie: elle peut contenir nimporte quoi.

Types, variables...

Constantes symboliques

Syntaxe : const type nom = val ; Par exemple: const int Taille = 100 ; Il ne sera pas possible de modier Taille dans le reste du programme (erreur ` a la compilation). . .

Types, variables...

Cha nes de caract` eres


Il existe une classe string, ce nest un pas un type el ementaire. Pour lutiliser, il faut placer t ete du chier : # include <string> string t ; d enit t comme une variable... string s(25,a) ; string mot = "bonjour" ; s.size() repr esente la longueur de s s[i] est le i-` eme caract` ere de s ( i = 0,1,. . . s.size()-1) s+t est une nouvelle cha ne correspondant ` a la concat enation de s et t. NB: il existe une autre sorte de cha ne de caract` eres en C/C++

Types, variables...

Tableaux
Pour utiliser la classe vector, il faut placer en t ete du chier : # include <vector> Un tableau est typ e: vector<int> Tab(100,5) ; vector<int> Tab(50) ; vector<double> T ; Structure g en erale: vector< type > Nom(n,v ) ; vector< type > Nom1 = Nom2 ; les valeurs de Nom2 sont alors recopi ees dans Nom1. T.size() correspond ` a la taille de T. NB: size() renvoie en fait un entier non sign e, son type exact est vector<type>::size type

Types, variables...

Tableaux

T[i] d esigne le i-` eme el ement avec i = 0, . . . T.size()-1. vector<vector<int> > T d enit un tableau ` a deux dimensions. Pour linitialiser, on peut utiliser linstruction suivante : vector<vector<int> > T2(100,vector<int>(50,1)) ; . . . on initialise chacune des 100 cases de T1 avec un tableau de taille 50 rempli de 1.

Expressions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Expressions

Aectation

En C/C++, laectation est une expression: Soient v une variable (au sens large) et expr une expression. v = expr aecte la valeur de expr ` a la variable v et retourne la valeur aect ee ` a v comme r esultat. Par exemple, i = (j = 0) aecte 0 ` a j puis ` a i et retourne 0 !!

Expressions

Op erateurs classiques

Op erateurs arithm etiques: *, +, -, / (division enti` ere et r eelle), % (modulo) Op erateurs de comparaison < (inf erieur), <= (inf erieur ou egal), == ( egal), > (sup erieur), >= (sup erieur ou egal) et != (di erent) Op erateurs bool eens && repr esente lop erateur ET, || repr esente le OU, et ! repr esente le NON. Par exemple, ((x<12) && ((y>0) || !(z>4)))

Expressions

Pr e et Post incr ement

++var incr emente la variable var et retourne la nouvelle valeur. (++i equivaut ` a i=i+1) var ++ incr emente la variable var et retourne lancienne valeur. (i++ equivaut ` a (i=i+1)-1) En dehors dune expression, i++ et ++i sont donc equivalentes.

Expressions

Pr e et Post d ecr ement

Lexpression --var d ecr emente la variable var et retourne la nouvelle valeur. Lexpression var -- d ecr emente la variable var et retourne lancienne valeur.

Instructions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Instructions

Instructions usuelles
d enition de variables, fonctions, types etc. expr ; { liste dinstructions } : instruction compos ee. if (expr ) instr if (expr ) instr1 else instr2 if (v == 3) i =i+4 ; if ((v==3) && (i<5)) { i=i+4 ; v=v*2 ;} else v=i ; r = r*3 ;

Instructions

La boucle FOR
for (expr1 ;expr2 ;expr3 ) instr
    

'

&

&

"

Ex: for(i=0 ;i<235 ;i=i+1) cout << T[i] ; for(i=0,j=1 ;i<235 ;i=i+1,j=j+3) cout << T[i][j] ;

Instructions

La boucle WHILE
while (expr ) instr

Instructions

La boucle DO
do instr while (expr ) ;

Entr ees - Sorties

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Entr ees - Sorties

Acher ` a l ecran

Pour utiliser les entr ees/sorties, il faut ajouter: # include <iostream> Syntaxe : cout < < expr1 < < . . . < < exprn ; Cette instruction ache expr1 puis expr2 . . . Acher un saut de ligne se fait au moyen de cout < < endl. int i=45 ; cout << "la valeur de i est " << i << endl ;

Entr ees - Sorties

Acher ` a l ecran
Syntaxe : cout < < expr1 < < . . . < < exprn ; cout (ou std::cout) d esigne le ot de sortie standard. < < est un op erateur binaire:
le premier op erande est cout (de type ot de sortie) le second op erande est lexpression ` a acher le r esultat est de type ot de sortie

< < est associatif de gauche ` a droite < < est surcharg e (ou sur-d eni): on utilise le m eme op erateur pour acher des caract` eres, des entiers, des r eels ou des cha nes de caract` eres etc.

Entr ees - Sorties

Lire au clavier

Syntaxe : cin > > var1 > > . . . > > varn ; Cette instruction lit (au clavier) des valeurs et les aecte ` a var1 puis var2 . . . cin est le ot dentr ee standard, et > > est un op erateur similaire ` a < <. Les caract` eres tap es au clavier sont enregistr es dans un buer dans lequel les cin viennent puiser des valeurs. Les espaces, les tabulations et les ns de lignes sont des s eparateurs.

Exemples

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Exemples

Exemples...

chaine.cc tab.cc es.cc

Evaluation des expressions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Evaluation des expressions

Evaluation des expressions


Priorit e des op erateurs : x[y] ++x x*y x+y x >> y x < y x == y x && y x || y x = y x op= y x? y : z x++ --x x/y x-y x << y x > y x != y x >= y x <= y !x x% y x--x

Evaluation des expressions

Evaluation des expressions bool eennes

Dans e1 && e2, la sous-expression e2 nest evalu ee que si e1 a et e evalu ee ` a true. if (i >=0 && T[i] > 20) blabla Dans e1 || e2, la sous-expression e2 nest evalu ee que si e1 a et e evalu ee ` a false. if (i<0 || T[i] > 20) blabla

Evaluation des expressions

Evaluation des expressions arithm etiques


Si une (sous-)expression m elange plusieurs types, cest le type le plus large qui est utilis e. int i=3,j=2,m ; double r=3.4 ; m = (i/j)*r ; Dabord lexpression (i/j) est evalu ee: / d esigne ici la division enti` ere, cela donne donc 1. Pour evaluer le produit 1*r, il faut convertir 1 en double (1.0) et faire le produit sur les doubles, cela donne 3.4 Pour laectation, comme m est entier, 3.4 est converti en int. Finalement on a m = 3.

Evaluation des expressions

Evaluation des expressions arithm etiques


Pour eviter les erreurs, il est possible de convertir explicitement des donn ees dun certain type en un autre. Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne...

Evaluation des expressions

Evaluation des expressions arithm etiques


Pour eviter les erreurs, il est possible de convertir explicitement des donn ees dun certain type en un autre. Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne... 5 !

Evaluation des expressions

Evaluation des expressions arithm etiques


Pour eviter les erreurs, il est possible de convertir explicitement des donn ees dun certain type en un autre. Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne... 5 ! L evaluation dune expression arithm etique ne se fait pas toujours de gauche ` a droite ! Ex: (i/j)*(r/3) (d emo)

Structure g en erale dun programme C++

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Structure g en erale dun programme C++

Structure g en erale dun programme

Un programme C++ est r eparti dans un ou plusieurs chiers. Chacun peut contenir des d enitions/d eclarations de fonctions, des d enitions de types et des d enitions de variables globales. Il existe une seule fonction main: cest la fonction qui sera ex ecut ee apr` es la compilation. Le prol de main est : int main() ou int main( int argc, char ** argv ) pour passer des arguments. Exemple de programme complet. . .

Structure g en erale dun programme C++

Structure g en erale dun programme


Un programme complet: #include <iostream> void test(int j) { cout << j << endl ; } int main() { int i =20 ; cout << "bonjour" << endl ; test(i) ; }

Proc edures et fonctions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Proc edures et fonctions

D enition de fonction
type nom( liste des param` etres) { corps } type est le type du r esultat de la fonction. (void si il sagit dune proc edure) La liste des param` etres (param` etres formels): type1 p1, ..., typen pn Le corps d ecrit les instructions ` a eectuer. Le corps utilise ses propres variables locales, les eventuelles variables globales et les param` etres formels. Si une fonction renvoie un r esultat, il doit y avoir (au moins) une instruction return expr ; Dans le cas dune proc edure, on peut utiliser: return ;

Proc edures et fonctions

Exemple

int max(int a,int b) { int res=b ; if (a>b) res = a ; return res ; }

Proc edures et fonctions

Appel dune fonction

nom(liste des arguments) La liste des arguments (param` etres r eels) est expr1 , expr2 , . . . exprn o` u chaque expri est compatible avec le type typei du param` etre formel pi. Exemple : int k=34, t=5, m ; m = max(k,2*t+5) ;

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; }

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x y

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 5 x 5 y 10 z a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 x 5 y 10 z a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 x 5 y 10 z a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10 z = 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } Fin

Proc edures et fonctions

Acher le contenu dun tableau dentiers

void AfficherTab(vector<int> T) { for (int i=0 ; i< T.size() ; i++) cout << T[i] << " " ; }

Proc edures et fonctions

Saisie dun tableau dentiers

Proc edures et fonctions

Saisie dun tableau dentiers


vector<int> SaisieTab() { int taille ; cout << " Entrer une taille : " ; cin >> taille ; vector<int> res(taille,0) ; for (int i=0 ; i< taille ; i++) { cout << " val = " ; cin >> res[i] ; } return res ; }

Proc edures et fonctions

Recherche du plus grand el ement

Proc edures et fonctions

Recherche du plus grand el ement

int Recherche(vector<int> T) { if (T.size()==0) { cout << Erreur ! Tableau vide ! << endl ; return -1 ; } int res=T[0] ; for (int i=1 ; i<T.size() ;i++) if (T[i] > res) res=T[i] ; return res ; }

Proc edures et fonctions

Recherche de lindice du plus grand el ement

Proc edures et fonctions

Recherche de lindice du plus grand el ement

int RechercheInd(vector<int> T) { if (T.size()==0) { cout << Erreur ! Tableau vide ! << endl ; return -1 ; } int res=0 ; for (int i=1 ; i<T.size() ;i++) if (T[i] > T[res]) res=i ; return res ; }

Proc edures et fonctions

Port ee des identicateurs

Un identicateur XXX peut etre utilis e` a la ligne l de la d enition dune fonction F ssi: XXX est une variable d enie dans une instruction compos ee contenant l . XXX est un param` etre de F . (XXX est une variable globale, i.e. d enie hors de toute fonction.)

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; }

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x y

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 5 a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 a 10 b 5

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10 z = 10

Proc edures et fonctions

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } Fin

Proc edures et fonctions

Passage de param` etres par valeur

Par d efaut, les param` etres dune fonction sont initialis es par une copie des valeurs des param` etres r eels. Modier la valeur des param` etres formels dans le corps de la fonction ne change pas la valeur des param` etres r eels.

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y x

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 5 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 5 aux 5 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 10 aux 5 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 5 b 10 aux 5 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x=5 y 10 x 5

Proc edures et fonctions

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Proc edures et fonctions

Passage des param` etres par r ef erence

Pour modier la valeur dun param` etre r eel dans une fonction, il faut passer ce param` etre par r ef erence. Une r ef erence sur une variable est un synonyme de cette variable, cest-` a-dire une autre mani` ere de d esigner le m eme emplacement de la m emoire. On utilise le symbole & pour la d eclaration dune r ef erence: Dans la liste des param` etres de la d enition dune fonction, type & pi d eclare le param` etre pi comme etant une r ef erence sur le i eme param` etre r eel vi .

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x y

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } b x 5 a y 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 5 a y 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 10 a y 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 10 a y 5

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 10 y 5

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 10 y 5

x = 10

Proc edures et fonctions

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } Fin

Proc edures et fonctions

Passage par r ef erence

Il faut que les param` etres r eels soient compatibles avec un passage par r ef erence. . . permut(x,5) nest pas possible ! Usage bizarre des r ef erences dans la liste des param` etres: const type & p Id ee: le passage par r ef erence est plus ecace que le passage par valeur car il evite la recopie des arguments car seule ladresse m emoire de largument est communiqu ee ` a la fonction.

Proc edures et fonctions

Exercice . . .

Algorithmes de tri Comment trier un tableau dentiers ?

Proc edures et fonctions

Exercice . . .

Algorithmes de tri Comment trier un tableau dentiers ? rechercher le plus grand el ement et le placer ` a la n du tableau recherche le deuxi` eme plus grand et le placer en avant-derni` ere position etc.

Proc edures et fonctions

Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand el ement de Tab entre les indices 0 ` a IndFin. Permuter les el ements plac es en IMAX et IndFin.

Proc edures et fonctions

Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand el ement de Tab entre les indices 0 ` a IndFin. Permuter les el ements plac es en IMAX et IndFin. A la premi` ere etape, on s electionne le plus grand el ement et on le place ` a la n du tableau ; puis on trouve le deuxi` eme plus grand et on le place ` a lavant-derni` ere place etc.

Proc edures et fonctions

Fonction de s election
int RechercheInd(vector<int> T, int imax) { if (T.size() < imax-1) { cout << "Erreur ! Tableau trop petit ! " << endl ; return -1 ; } int res=0 ; for (int i=1 ; i<= imax ;i++) if (T[i] > T[res]) res=i ; return res ; }

Proc edures et fonctions

Fonction de s election
vector<int> Trier(vector<int> T) { vector<int> Taux = T ; int aux ; for (int i=Taux.size()-1 ; i>0 ; i--) { aux = RechercheInd(Taux,i) ; Permuter(Taux[aux],Taux[i]) ; } return Taux ; }

Proc edures et fonctions

Fonction de s election

Tri in situ avec passage par r ef erence void Trier(vector<int> & T)

Proc edures et fonctions

Fonction de s election

Tri in situ avec passage par r ef erence void Trier(vector<int> & T) { int aux ; for (int i=T.size()-1 ; i>0 ; i--) { aux = RechercheInd(Taux,i) ; Permuter(T[aux],T[i]) ; } }

R ecursivit e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

R ecursivit e

Fonctions r ecursives

La factorielle... int fact(int n) { assert(n>=0) ; if (n==0) return 1 ; return n*fact(n-1) ; }

R ecursivit e

Les tours de Hanoi

void Hanoi(int nb,int p1, int p2) { if (nb > 0) { int p3 = 6-p1-p2 ; Hanoi(nb-1,p1,p3) ; cout << "On bouge le Pion " << nb << " vers " << p2 ; Hanoi(nb-1,p3,p2) ; } }

Compl ements sur les fonctions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Compl ements sur les fonctions

Valeurs par d efaut des param` etres

On peut attribuer des valeurs par d efaut aux param` etres dune fonction. int max(int a,int b =0) { if (a>b) return a ; else return b ; }

Compl ements sur les fonctions

Recherche dichotomique
int RechDicho(vector<double> Tab,int bg, int bd,double x) { if (bg > bd) return -1 ; int M = (bg+bd)/2 ; if (Tab[M]==x) return M ; if (Tab[M] > x) return RechDicho(Tab,bg,M-1,x) ; else return RechDicho(Tab,M+1,bd,x) ; } int Recherche(vector<double> Tab,double x) { int taille = Tab.size() ; if (taille == 0) return -1 ; return RechDicho(Tab,0,taille-1,x) ; }

Compl ements sur les fonctions

Recherche dichotomique
int Recherche(vector<double> Tab, double x, int bg =-1, int bd =-1) { if((bg==-1)&&(bd ==-1)) return Recherche(Tab,x,0,Tab.size()-1) ; if (bg > bd) return -1 ; int M = (bg+bd)/2 ; if (Tab[M]==x) return M ; if (Tab[M] > x) return Recherche(Tab,x,bg,M-1) ; else return Recherche(Tab,x,M+1,bd) ; } Appel directement avec: Recherche(T,10.3)

Compl ements sur les fonctions

Fonctions inline

Pour de petites fonctions, il peut etre plus ecace (= rapide) d eviter un appel de fonction et ` a la place, expanser le corps de la fonction en lieu et place de chaque appel. Cest possible avec le mot cl e inline. inline int max(int a,int b =0) { if (a>b) return a ; else return b ; }

Compl ements sur les fonctions

Le tri fusion

Principe: Pour trier un tableau T entre les indices a et b : On trie entre a et On trie entre
a +b 2 a +b 2

et b

On construit un tableau tri e` a partir des sous-parties tri ees.

Port ee, visibilit e, dur ee de vie des variables

void Tri fusion(vector<int> & T,int bg =-1, int bd =-1) { if ((bg==-1) && (bd==-1)) { bg=0 ; bd=int(T.size()) -1 ; } int k ; if (bg < bd) { k = (bg+bd)/2 ; Tri fusion(T,bg,k) ; Tri fusion(T,k+1,bd) ; Fusion(T,bg,k,bd) ; }

Port ee, visibilit e, dur ee de vie des variables

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Port ee, visibilit e, dur ee de vie des variables

Port ee dun identicateur

La port ee dun identicateur correspond aux parties du programme o` u cet identicateur peut etre utilis e sans provoquer derreur ` a la compilation. La port ee dune variable globale ou dune fonction globale est egale au programme. enition jusqu` a la n de La port ee dune variable locale va de sa d la premi` ere instruction compos ee ({...}) qui contient sa d enition. Deux variables peuvent avoir le m eme nom mais dans ce cas, elle doivent avoir deux port es di erentes.

Port ee, visibilit e, dur ee de vie des variables

Port ee
{ int i=3 ; { int i=5 ; cout << i ; // affiche 5 } cout << i ; // affiche 3 } Les deux variables ont des port ees di erentes ! Exemple. . .

Port ee, visibilit e, dur ee de vie des variables

Visibilit e

La visibilit e dune variable dit quand elle est accessible La visibilit e est inclue dans la port ee... La dur ee de vie dune variable correspond ` a la p eriode depuis cr eation ` a sa destruction. Dur ee de vie et port ee co ncident pour toutes les variables que nous avons evoqu ees jusquici. mais . . .

Port ee, visibilit e, dur ee de vie des variables

Variables static
Lespace m emoire dune variable locale d eclar ee static est allou e une seule fois et nest d etruit qu` a la n du programme ! void Test(int v) { static int compteur=0 ; compteur++ ; cout << compteur << "-eme appel de Test"<< endl ; cout << " v = " << v << endl ; } Sa dur ee de vie est celle du programme.

Port ee, visibilit e, dur ee de vie des variables

Hanoi (suite)
Obj: compter le nombre dappels ` a la proc edure Hanoi. void Hanoi(int nb,int p1, int p2, int affichage=0) { static int NB = 0 ; NB++ ; if (affichage == 1) { cout << NB << " appels de Hanoi " return ; } if (nb > 0) { int p3 = 6-p1-p2 ; Hanoi(nb-1,p1,p3) ; cout << "On bouge le Pion " << nb << " vers le piquet " << p2 << endl ; Hanoi(nb-1,p3,p2) ; } }

Port ee, visibilit e, dur ee de vie des variables

Espace de noms
Un programme important utilise de nombreuses biblioth` eques, fonctions etc. Pour eviter les probl` emes de conit de noms, on utilise des espaces de noms (namespace) : on associe un nom ` a un ensemble de variables, types, fonctions. leur nom complet est: leur nom despace suivi de :: et de leur nom. Ex. la fonction int fct(){...} d enie dans le domaine A aura pour nom complet A::fct() Les noms complets de cout et cin sont std::cout et std::cin. Pour eviter d ecrire les noms complets , on utilise: using namespace std ;

Port ee, visibilit e, dur ee de vie des variables

Cr eer un espace de nom

namespace toto { int N = 10 ; int Test() { cout << "test... " ; } } Les objets N et Test ont pour nom toto::N et toto::Test

Compl ements

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements

Compl ements

Compl ements - 1
Instructions suppl ementaires: break provoque larr et de la premi` ere instruction do, for, switch ou while englobant. continue provoque (dans une instruction do, for, ou while) larr et de lit eration courante et le passage au d ebut de lit eration suivante. switch (exp ) { case cste1 : liste dinstructions1 ... case csten : liste dinstructionsn default: liste dinstructions }

Compl ements

Compl ements - 2

(exp ) ? exp1 : exp2 vaut exp1 si exp est evalu ee ` a vrai et exp2 sinon. m = (i < j) ? i : j var op = expr d esigne lexpression var = var op expr (op {+,-,*,/,%}) int i=2,j=34 ; int i=2,j=34 ; i += 2 ; i = i+2 ; j *= 10 ; j = j*10 ; j *= (i++) ; j = j*i ; i = i+1 ;

Compl ements

Compl ements - 2

(exp ) ? exp1 : exp2 vaut exp1 si exp est evalu ee ` a vrai et exp2 sinon. m = (i < j) ? i : j var op = expr d esigne lexpression var = var op expr (op {+,-,*,/,%}) int i=2,j=34 ; int i=2,j=34 ; i += 2 ; i = i+2 ; j *= 10 ; j = j*10 ; j *= (i++) ; j = j*i ; i = i+1 ; A la n, on a: i==5 et j==1360

Troisi` eme partie III Classes C++

Introduction

Plan
14

Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs

15

16

17

Introduction

Introduction

Un algorithme nutilise pas que des objets de type int, double ou bool... etats et transitions lorsquon parle de graphes. Piquet et pions pour Hanoi Fractions Piles Un programme doit coller ` a lalgorithme !

Introduction

De nouveaux types

Il faut pouvoir d enir de nouveaux types de donn ees. D enir des variables de ce types, les manipuler dans les fonctions etc.

Introduction

De nouveaux types

Il faut pouvoir d enir de nouveaux types de donn ees. D enir des variables de ce types, les manipuler dans les fonctions etc. Un type de donn ees = regroupement de donn ees + des op erations Comme les types de base !

Regroupement de donn ees

Plan
14

Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs

15

16

17

Regroupement de donn ees

Regroupement de donn ees

Exemple: une base de donn ees pour les notes des etudiants.

Regroupement de donn ees

Regroupement de donn ees

Exemple: une base de donn ees pour les notes des etudiants. Chaque che d etudiant contient : un nom et un pr enom un num ero dinscription un ensemble de notes Une base de donn ees pour une promo = un ensemble de ches

Regroupement de donn ees

Fiche d etudiants. . .

D enir le type che:


struct FicheEtudiant { s t r i n g Nom ; s t r i n g Prenom ; i n t Numero ; v e c t o r <d o u b l e > N o t e s ; };

Ce nest pas ordonn e...

Regroupement de donn ees

Fiche d etudiants. . .

Autre d enition equivalente pour le type che:

struct FicheEtudiant { s t r i n g Nom, Prenom ; i n t Numero ; v e c t o r <d o u b l e > N o t e s ; };

Regroupement de donn ees

Utilisation des ches

fiche est un type comme les autres: fiche F ; d enit une variable F de type che. Une che contient plusieurs parties (champs), on y acc` ede par leur nom pr ec ed e dun point . : F.Nom d esigne le champ (de type string) Nom de la che F. F.Notes[i] d esigne le champ (de type double) Notes[i] de la che F. etc.

Regroupement de donn ees

Utilisation des ches

D enir les champs dune che:


FicheEtudiant F; F . Nom = T a k i s ; F . Prenom = Jean ; F . Numero = 1 2 3 4 ; F . Notes [ 2 ] = 12.3 ;

Regroupement de donn ees

Utilisation des ches

Une fonction acher...


void Afficher ( FicheEtudiant v) { c o u t << No : << v . Numero << << f o r ( i n t i =0; i < v . N o t e s . s i z e ( ) ; i ++) c o u t << v . N o t e s [ i ] << ; c o u t << e n d l ; }

v . Prenom <<

demo 1-2-3

Regroupement de donn ees

Les struct

On utilise le type d eni pat un struct comme nimporte quel autre type: dans les fonctions (param` etre ou r esultat), les variables, les tableaux etc. Les aectations (param` etres de fonction, variable, etc.) se font champ ` a champ.

Classes C++

Plan
14

Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs

15

16

17

Classes C++

Les classes C++

Lorsquon d enit un type de donn ees, on fournit des fonctions de manipulation et impose leur usage: les d etails dimpl ementation nont pas ` a etre connus par lutilisateur. eger certaines donn ees. On veut donc orir une interface et prot Les classes permettent de regrouper des donn ees associer des fonctions aux objets de la classe restreindre lacc` es ` a certaines donn ees

Classes C++

Fichier d etudiants
On veut construire des bases de donn ees pour stocker les ches d etudiants de chaque promo. Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, pr enoms et num eros des etudiants : (initialisation de la base) saisir des notes pour un etudiant acher les notes dun etudiant acher la moyenne dun etudiant acher la moyenne pour un cours acher la moyenne g en erale

Classes C++

Fichier d etudiants
On veut construire des bases de donn ees pour stocker les ches d etudiants de chaque promo. Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, pr enoms et num eros des etudiants : (initialisation de la base) saisir des notes pour un etudiant acher les notes dun etudiant acher la moyenne dun etudiant acher la moyenne pour un cours acher la moyenne g en erale Et cest tout !

Classes C++

Fichier d etudiants

Chaque promo doit contenir les donn ees suivantes: le nombre d etudiants le nombre de cours la liste des cours la che de chaque etudiant

Classes C++

Fichier d etudiants
On int` egre donc les donn ees suivantes dans une promo:
c l a s s Promo { private : i n t Nbc ; i n t Nbe ; v e c t o r <s t r i n g > C o u r s ; v e c t o r <F i c h e E t u d i a n t > E t u d i a n t s ; ... };

Classes C++

Comment d enir les fonctions associ ees

On va utiliser une autre approche que celle pr esent ee dans la partie A. On va prot eger certains aspects du type Promo: la structure interne, le nom des champs... On va d enir des fonctions particuli` eres (fonctions membre, m ethodes) qui seules pourront acc eder ` a la partie cach ee du type Promo. Ces m ethodes seront linterface de la classe. On les d enit dans la classe.

Classes C++

M ethode - fonction membre


Ces fonctions sappliquent toujours ` a un objet de la classe, plus eventuellement ` a dautres param` etres. Cet objet joue un r ole particulier: on dit que lon appelle la m ethode sur lui. Le m ecanisme dappel de ces fonctions tient compte de cette di erence et s epare cet objet des autres param` etres: Plut ot que de faire Test(o,p1,...,pk), on fait: o.Test(p1,...,pk) On appelle Test comme un champ... Vision: o re coit le message ou l ordre Test.

Classes C++

M ethode - fonction membre


Les m ethodes sont d eclar ees dans la classe. Le nom complet de la m ethode Test de la classe Toto est Toto::Test Les m ethodes peuvent acc eder aux champs des objets de la classe: ce sont les seules ` a pouvoir le faire (ou presque) ! Lobjet sur lequel elle sont appel ees, nappara t explicitement dans la d enition des m ethodes. Par d efaut, les champs apparaissant dans la d enition dune m ethode sont ceux de lobjet sur lequel la fonction sera appel ee.

Classes C++

Initialisation
c l a s s Promo { private : i n t Nbc ; i n t Nbe ; v e c t o r <s t r i n g > C o u r s ; v e c t o r <F i c h e E t u d i a n t > E t u d i a n t s ; public : void I n i t i a l i s a t i o n ( ) ; void SaisieNotes ( int n ) ; void AfficheNotesE ( i n t n ) ; d o u b l e MoyenneE ( i n t n ) ; d o u b l e MoyenneC ( i n t c ) ; d o u b l e MoyenneG ( ) ; };

Classes C++

Initialisation
v o i d Promo : : I n i t i a l i s a t i o n ( ) { c o u t << Nb d e t u d i a n t s : ; c i n >> Nbe ; c o u t << Nb de c o u r s : ; c i n >> Nbc ; C o u r s = v e c t o r < s t r i n g >(Nbc ) ; E t u d i a n t s = v e c t o r < F i c h e E t u d i a n t >(Nbe ) ; f o r ( i n t i =0; i < Nbc ; i ++) { c o u t << C o u r s << i << : ; c i n >> C o u r s [ i ] ; } f o r ( i n t i =0; i <Nbe ; i ++) { c o u t << Nom : ; c i n >> E t u d i a n t s [ i ] . Nom ; c o u t << Prenom : ; c i n >> E t u d i a n t s [ i ] . Prenom ; c o u t << Numero : ; c i n >> E t u d i a n t s [ i ] . Numero ; E t u d i a n t s [ i ] . N o t e s = v e c t o r <d o u b l e >(Nbc ) ; } }

Classes C++

Constructeurs

M ethodes particuli` eres appel ees automatiquement ` a chaque d enition dun objet de la classe. Pour passer des arguments ` a un constructeur, il sut de faire suivre le nom de la variable par la liste des arguments : MaClasse A(i,f) ; Lorsquaucun argument nest donn e, le constructeur sans argument est appel e. Si aucun constructeur nest d eni explicitement, le compilateur cr ee un constructeur sans argument MaClasse::MaClasse() qui se contente dappeler les constructeurs (sans argument) de chaque champ de lobjet.

Classes C++

Constructeur copieur
MaClasse (const MaClasse &) : utilis e pour le passage des param` etres et les initialisations. Si une fonction a un param` etre A du type MaClasse, un appel de cette fonction avec une variable V de MaClasse conduit ` a linitialisation de A avec V via le constructeur copieur. Lorsquon d enit une variable V et quon linitialise ` a une valeur E, par linstruction MaClasse V=E ;, on utilise le constructeur copieur. Di erence avec : MaClasse V ; V=E ; Le constructeur copieur cr e e par d efaut fait une initialisation champ ` a champ avec les champs de largument.

Classes C++

Constructeur / destructeur

Il existe aussi des destructeurs : on peut d enir un (et un seul) destructeur qui est appel e automatiquement lorsquune variable locale est d etruite (surtout utiles pour les structures de donn ees dynamiques) Pour comprendre tous ces m ecanismes dappel... il faut les essayer !! cf. Constructeurs.cc

Classes C++

Fonctions amies
Si une fonction F est amie (friend) dune classe C1, alors F peut acc eder aux champs priv es de C1. Si une classe C2 comme est amie de C1, toutes les fonctions membres de C2 peuvent acc eder aux champs priv es de C1. Ces d eclarations se font dans la d enition de C1 :
c l a s s C1 { ... f r i e n d t y p e de F F ( paramde F ) ; f r i e n d c l a s s C2 ; ... };

Classes C++

Conversions entre types


Comme pour les types simples, on peut d enir des conversions entre les classes. Un constructeur de T1 qui prend un unique param` etre de type T2 d enit implicitement une conversion de T2 dans T1. (pas de composition: ne marche que pour des conversions en une etape) Une fonction membre operator T1() dans la classe T2 d enit aussi une conversion de T2 dans T1. ( evite de modier la d enition de T1) Par exemple :
class fraction { public : ... fraction ( int v) { num=v ; den =1; } d o u b l e ( ) { r e t u r n d o u b l e (num) / den ; } };

Surcharge dop erateurs

Plan
14

Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs

15

16

17

Surcharge dop erateurs

Surcharge dop erateurs


Il est possible de surcharger les op erateurs de C++ (+, -, [ ], =, ==, . . . ): les arit es et les priorit es ne changent pas. Deux points de vue: fonction globale: A op B est vue comme lapplication dune fonction op ` a deux arguments A de type TA et B de type TB.
f r a c t i o n o p e r a t o r ( f r a c t i o n f , f r a c t i o n g ) { r e t u r n f r a c t i o n ( f . Numerateur ( ) g . Numerateur ( ) , f . Denominateur ( ) g . Denominateur ( ) ) ; } f r a c t i o n o p e r a t o r ( f r a c t i o n f ) { r e t u r n f r a c t i o n ( f . Numerateur ( ) , f . Denominateur ( ) ) ; }

Surcharge dop erateurs

Surcharge dop erateurs


fonction membre: A op B est vue comme lapplication dune fonction op ` a un argument B de type TB sur lobjet A de type TA.
class fraction { private : i n t num , den ; public : ... f r a c t i o n o p e r a t o r (); f r a c t i o n o p e r a t o r ( f r a c t i o n h ) ; }; f r a c t i o n f r a c t i o n : : o p e r a t o r () { r e t u r n f r a c t i o n (num , den ) ; } f r a c t i o n f r a c t i o n : : o p e r a t o r ( f r a c t i o n h ) { r e t u r n f r a c t i o n (num h . num , den h . den ) ; }

Surcharge dop erateurs

Surcharge de cout <<

Lop erateur << ne peut etre surcharg e que de mani` ere globale. Prol pour un type T: ostream & << (ostream & , T ) Exemple:
// o s t r e a m & o p e r a t o r <<(o s t r e a m & os , f r a c t i o n f ) { o s << f . Numerateur ( ) << / << f . D e n o m i n a t e u r ( ) ; r e t u r n os ; } //

Quatri` eme partie IV Structures de donn ees dynamiques

Pointeurs

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes

19

20

21

22

Pointeurs

Pointeurs

Une variable permet de d esigner par un nom un emplacement dans la m emoire. Il est aussi possible de d esigner directement les cases m emoire par leur adresse. Un pointeur permet de stocker ces adresses m emoire.

Pointeurs

Pointeurs, *, &
Un pointeur est typ e : on distingue les pointeurs sur un int, sur un double, sur une fraction etc. D enir un pointeur: type * nom ; nom est un pointeur sur type , i.e. pouvant recevoir une adresse d esignant un objet de type type . &V repr esente ladresse m emoire dune variable V. *P d esigne lobjet point e par le pointeur P.
i n t i , pi , k ; i =3; p i = &i ; // p i p o i n t e s u r i k = ( p i )+5; // i d e n t i q u e ` a : k=i +5 ( p i ) = k +2; // i d e n t i q u e ` a : i = k+2 ( p i )++; // i c i , i =11 , k=8

Pointeurs

Pointeurs et r ef erences

Au lieu du passage par r ef erence, il est possible de passer (par valeur) les adresses des arguments dune fonction et de modier les donn ees contenues ` a ces adresses via lop erateur *. Fonction permut :
v o i d permut ( i n t pa , i n t pb ) { i n t aux = ( pa ) ; ( pa ) = ( pb ) ; ( pb ) = aux ; }

Pour echanger les valeurs de i et j, on ecrit permut(&i,&j) ; (seule solution en C)

Pointeurs et tableaux

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes

19

20

21

22

Pointeurs et tableaux

Tableaux ` a la C
type nom[taille ] ; d enit un tableau d el ements de type type et de taille taille (indices de 0 ` a taille 1). L el ement dindice i est d esign e par nom[i ]. Dans int Tab[10], Tab d esigne ladresse de la premi` ere case du tableau (i.e. &Tab[0]) et le type de Tab est const int *. Quest-ce que Tab[i] ?

Pointeurs et tableaux

Tableaux ` a la C
type nom[taille ] ; d enit un tableau d el ements de type type et de taille taille (indices de 0 ` a taille 1). L el ement dindice i est d esign e par nom[i ]. Dans int Tab[10], Tab d esigne ladresse de la premi` ere case du tableau (i.e. &Tab[0]) et le type de Tab est const int *. Quest-ce que Tab[i] ? cest (*(Tab+i)).
int T[10]; int p; p = &T [ 4 ] ; p [ 0 ] = 100; p [ 1 ] = 200;

// //

equivaut ` a T [ 4 ] = 100 equivaut ` a T [ 5 ] = 100

Pointeurs et tableaux

Pointeurs et tableaux
Passer un tableau C en param` etre dune fonction revient ` a passer ladresse de la premi` ere case passage par r ef erence. Pour d eclarer un param` etre T de type tableau dentiers, on ecrit: int T[]. La taille doit etre pass ee avec un autre param` etre. void Tri(int T[],int taille) autres cha nes de caract` eres : tableaux (simples) de caract` eres se terminant par le caract` ere sp ecial \0. char T[8] = "exemple" ; d enit et initialise le tableau T avec T[0]= e, T[1]=x, . . . , T[7]=\0.

new et delete

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes

19

20

21

22

new et delete

new et delete

obj : allouer et d esallouer de la m emoire sans d ependre la dur ee de vie des variables. new type ; alloue un espace m emoire pour contenir un objet de type type et retourne ladresse ce cette zone m emoire. P = new type [N ] ; alloue un espace m emoire capable de contenir N objets de type type ... delete P ; d esalloue lespace m emoire dadresse P . (ou delete [ ] P ;) Une zone allou ee par new nest d esallou ee que par lappel de delete. . .

new et delete

Un peu de cin ema ...

structures de donn ees dynamiques

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes

19

20

21

22

structures de donn ees dynamiques

Structures de donn ees dynamiques


Une structure de donn ees dynamique evolue au cours du temps. Exemple de la pile: utiliser un tableau oblige ` a borner la taille de la pile. On pr ef` ere allouer de lespace m emoire en fonction des besoins : ajouter un el ement ` a la pile correspondra ` a allouer (avec new) de la m emoire, et supprimer reviendra ` a d esallouer (avec delete) la case contenant lobjet. Le contenu de la pile sera donc eclat e dans la m emoire Pour ne pas perdre d el ements, on indique ` a chaque el ement o` u se trouve le prochain el ement. Cela correspond ` a la notion de liste cha n ee

structures de donn ees dynamiques

Listes cha n ees


Un maillon dune liste cha n ee:
c l a s s element { public : int val ; element s u i v a n t ; };

Le champ suivant contient ladresse du prochain el ement de la liste (ou 0). On utilise ladresse du premier el ement de la liste... Parcours de liste, inversion, longueur. . . Listes doublement cha n ees, circulaires, . . .

Retour sur les classes

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes

19

20

21

22

Retour sur les classes

Classes et pointeurs

p->champ raccourci pour (*p).champ p->fct() raccourci pour (*p).fct() Lorsquon alloue de la m emoire pour stocker un objet de type T, un constructeur est appel e:
soit celui sans argument (dans le cas dun new T), soit un avec argument si des arguments sont pr esents ( new T(a1,...,aN) ;).

Dans la d enition des fonctions membre, on peut acc eder ` a ladresse de lobjet courant: pointeur this.

Cinqui` eme partie V Compl ements

Compl ements

H eritage Programmation orient ee objet G en ericit e (classes, fonctions) GDB Exceptions ...

S-ar putea să vă placă și