Vous êtes sur la page 1sur 83

Programmation Oriente Objet: C++

Mr. Youness TABII

Introduction
Vrifications de type + stricte Surcharge de fonctions et des Oprateurs Rfrences Gestion mmoire + facile Entres/sorties + facile Classes et hritage Programmation gnrique ...

C++ = C +

Introduction
Tout comme en C, un module C++ est gnralement implant par un fichier dinterface et un fichier dimplmentation. .hh, .H ou .hpp, fichiers dinterface contenant les services offerts par le module. .cc, .C ou .cpp, fichiers dimplmentation C++

Introduction
Principe POO: Notion de classe Des objets similaires peuvent tre informatiquement dcrits par une mme abstraction : une classe mme structure de donnes et mthodes de traitement valeurs diffrentes pour chaque objet Classe Perssone -nom, prnom, statut Classe Lecteur -nom, prnom

Classe Voiture -modele, couleur

Introduction
Principe POO
Programmation par Objet: Unit logique : Objet Objet dfini par : Un tat Un comportement Une identit Personne Variable: age=32 Methode: get_age() Comportement tat : reprsent par des attributs(variable) qui stockent des valeurs. Comportement : dfini par des mthodes qui modifient un tat. Identit : permet de distinguer un objet dun autre objet. tat Identit

Les Types Primitifs et Commentaires


Les types primitifs sont les mmes quen C (char, int, float, double, void) auxquels il sajoute un type supplmentaire bool. Une variable de type bool peut prendre deux valeurs true ou false. Les commentaires peuvent se faire comme en C (/* .... */) ou en utilisant le sigle de commentaires court // tenant sur une ligne.

Nouvelles Entres/Sorties
Les entres-sorties on t remanies pour profiter de la surcharge!!!. Pour pouvoir les utiliser il faut inclure len-tte <iostream> Il existe trois flots :
cin : entre standard (clavier par dfaut) cout : sortie standard (cran par dfaut) cerr : sortie message derreur (cran par dfaut)

Les oprateurs << et >> permettent de faire les critures et les lectures Ils sont surchargs pour permettre lutilisation de tous les types primitifs

Nouvelles Entres/Sorties
C
#include <stdio.h>

C++
#include <iostream> #include <fstream> #include <strstream> cout -> standard output cerr -> standard error output cin <- standard input ofstream -> output file ifstream <- input file ostringstream -> char*[N] istringstream <- char*[N] ostream& operator<< istream& operator>>

printf --> standard output

scanf <-- standard input fprintf --> FILE* fscanf <-- FILE* sprintf --> char[N] sscanf <-- char*[N]

Nouvelles Entres/Sorties
Il ny a plus de problmes de type.
printf et scanf vs cin et cout

Les instructions rduites.

gnres

sont

plus

Il est possible de surcharger les oprateurs et pour manipuler dautres types.

Nouvelles Entres/Sorties
Exemple

C
#include <stdio.h> int valeur = 10;

C++
#include <iostream> using namespace std; int valeur = 10;

printf( valeur = %d\n,valeur ); cout << Valeur= << valeur<<endl; printf( New valeur = ??\n ); scanf( %d, &valeur ); cout << New valeur = ?? <<endl; cin >> valeur;

Dclarations/Allocation
Allocation dynamique grce aux oprateurs new et delete (ne plus utiliser malloc et free !!) Il nest plus ncessaire dutiliser sizeof Pour les tableaux les oprateurs new et delete sont remplacs par new[] et delete[]

Dclarations/Allocation
Exemple

C
Boucles
int i; for (i=0; ;)

C++
for(int i=0 ; ; ) /* Cette possibilite sappliquee sur toutes les instructions : switch, while et do while */

Tableaux
int value = 10; int* var = (int*)malloc(sizeof(int)); *var = value; int* array = (int*)malloc(n*sizeof(int)); ... free( var ); free( array ); int value = 10; int* var = new int( value ); int* array = new int[10]; ... delete var; delete [] array;

Notion de Rfrence
En plus des pointeurs, les rfrences sont une autre manire de manipuler les adresses des objets placs dans la mmoire. Une valeur de type rfrence est une adresse mais, hormis lors de son initialisation, toute opration effectue sur la rfrence agit sur l'objet rfrenc, non sur l'adresse
int n; int & ref = n; n = 3; Cout << la valeur de n est : << ref << endl

int & ref=n; signifie que ref est une rfrence sur la variable n

Resultat: la valeur de n est : 3


Notez bien quune fois dclare et initialise, une rfrence ne peut plus tre modifier
int p = 5; ref = p; Cout << la valeur de n est : << n << endl

Resultat: la valeur de n est : ???!!!

Passage de paramtres et valeur de retour


En C, le passage des paramtre et valeurs de retour se fait par valeur. Pour simuler un passage par adresse on utilise alors les pointeurs. En C++ on peut utiliser les Rfrences pour effectuer ce passage par adresse Le choix du mode de transmission se fait lors de la dclaration de la fonction La transmission darguments lcriture de la fonction. par rfrence simplifie

Transmission par Valeur/Adresse/Rfrence


Exemple
Transmission par Valeur
#include <iostream> using namespace std main(){ void echange(int,int); int n=5,p=100; cout<< avant lchange n= <<n<<, p=<<p<<endl; echange(n,p); cout<< avant lchange n= <<n<<, p=<<p<<endl; }

Transmission par Adresse


#include <iostream> using namespace std main(){ Void echange(int*,int*); int n=5,p=100; cout<< avant lchange n= <<n<<, p=<<p<<endl; echange(&n,&p); cout<< avant lchange n= <<n<<, p=<<p<<endl; }

Transmission par Rfrence


#include <iostream> using namespace std main(){ Void echange(int&,int&); int n=5,p=100; cout<< avant lchange n= <<n<<, p=<<p<<endl; echange(n,p); cout<< avant lchange n= <<n<<, p=<<p<<endl; }

echange(int a,int b){ int tmp=a; a=b; b=tmp; }

echange(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp; }

echange(int &a,int &b){ int tmp=a; a=b; b=tmp; }

Les Classes
Une classe permet de dfinir (interface et implmentation) un objet en terme de structure de donnes et de fonctionnalits. On trouve lintrieur dune Classe C++ :
Les attributs (variables dfinies dans la classe) Les mthodes (services offerts par la classe)

Pour dclarer une classe il faut utiliser le mot cl class. Les attributs et mthodes sont ensuite dfinis comme les champs dans une structure C

Les Classes
Publique, Protg ou Priv
Les structures en C ne permettent que de runir des variables, en C++ une classe y ajoute des fonctions. Une classe C++ peut comporter plusieurs sections public, protected ou private qui permettent de modifier le niveau de masquage des informations. public : attributs et/ou mthodes accessibles par nimporte quel client de la classe. protected ou private : attributs et/ou mthodes inaccessibles aux clients extrieurs de la classe. (On verra la diffrence entre ces deux notions un peu plus tard) Les attributs et les fonctions sont par dfaut privs (Private)

Les Classes
Publique, Protg ou Priv et lencapsulation

Par convention les attributs de la classes sont protected ou private. On les dclare dans une section autre que public. Consquence : les attributs ne sont plus directement accessibles ! Il faut des mthodes daccs publiques. Cest ce quon appelle lencapsulation.

Les Classes
Utilisation

Une classe dfinit un type qui peut tre utilis comme tout autre type disponible Laccs aux champs (mthodes et attributs) se fait de faon pointe (.) (objet ou rfrence sur objet) La notation flche (->) est utilise lorsque lon dispose dun pointeur sur un objet.

Les classes : Dfinition


class nom_classe

{
private:
Dclaration des donnes prives et des fonctions membres prives

public:
Dclaration des donnes publiques et des fonctions membres publiques

};

Les classes: Dfinition


Exemple
class Point { private: int x; inty; public: int getX(); int getY(); }; int Point getX(){ return x; } int Point return y; }

::

:: getY(){

Les fonctions membre sont dfinies lextrieur de la classe Point.

:: est loprateur de rsolution de porte

Les Classes: Instanciation


Cration dun objet

Linstanciation dune classe ou la cration dun objet dune classe se faite comme suivant:
Cration dun objet

Cration dun objet

Point p1(); Point p2=Point(); Point* p3=new Point();

Classe : Point - int x - int y + getX() + getY() + setX(int) + setY(int) + deplacer(int,int) + affichePoint()

. p2.affichePoint();
p1 affichePoint(); P3->affichePoint();

Appel de la fonction affichePoint

Appel de la fonction affichePoint

Les Accesseurs/Modificateurs
Les accesseurs sont des mthodes membre qui permet daccder aux attributs dun objet
Exemple
get_num_client() // pour accder au numro de client get_solde() // pour accder au solde de client

Les modificateurs sont des mthodes membre qui modifie ltat (attributs) de lobjet
Exemple
set_num_client(nouveau_num) Set_solde(nouveau_solde)

Exercice: cration dun objet


Crer les classes suivantes. Les interfaces sur des fichiers .h et les implmentations sur .cpp
Personne - nom - prenom - age - cordonnee - date_naissance /* ajoutez les accesseurs et les modificateurs */ Cordonnee - adresse - telephone - mail /* ajoutez les accesseurs et les modificateurs */ - jour - mois - annee /* ajoutez les accesseurs et les modificateurs */ Date

Crer la fonction main pour tester les classes

Constructeur/Destructeur
Il est souvent ncessaire dinitialiser un objet au moment de la cration. Parfois il faut mme effectuer de lallocation de mmoire. Il est donc ncessaire de disposer dune (ou plusieurs) mthode(s) spciale(s) pour faire cette initialisation : le Constructeur. De la mme faon il faut pouvoir dsallouer de la mmoire utilise par un objet lorsque lon ne lutilise plus. On utilise alors une mthode particulire : le Destructeur

Constructeur
Les constructeurs nont aucun type de retour (mme pas void !!!). Ils portent le mme nom que la classe laquelle ils appartiennent Il sont rarement appels explicitement par le programmeur. Le compilateur se charge dutiliser le bon constructeur (surcharge!!) la cration de lobjet.

Destructeur
Il ny a quun seul destructeur par classe!!! Son identificateur est compos du nom de la classe prcd du signe : ~Type(). I Les destructeurs nont pas de paramtres ni de type de retour. Il est prfrable de prfixer les destructeurs par le mot cl virtual. (on verra une explication plus tard dans le cours) Les destructeurs ne sont jamais explicitement appell par le programmeur.

Constructeur/Destructeur
Exemple
class Point { private: int x; inty; public:

Dclaration de destructeur vide

main{ Point p0; Point p1=Point(); Point p1(2,5); Point p2=Point(11,6); Point* p3=new Point(); p0.affichePoint(); P3->affichePoint();

Dclaration dun constructeur avec arguments


}; Point :: Point(){

Point(); Point(int, int); virtual ~Point(); int getX(); int getY();

x=0; y=0; } Point :: Point(int a,int b){ x=a; y=b; } int Point :: getX(){ return x; }

Dclaration de destructeur

Destructeur

delete p3; }
Destruction de lobjet p3

int Point :: getY(){ return y; } Point :: ~Point(){ cout<<cest fini << }

Mot cl THIS
Le mot cl this est le symbole de lauto-rfrence. Lorsquune fonction membre est appele elle implicitement une rfrence vers lobjet appelant. reoit

En gnral, laccs aux attributs privs se fait de faon directe. Dans certain cas, on a besoin de connatre ladresse de lobjet appelant (insertion dun objet dans une liste) this est un pointeur vers cet objet appelant Il ne peut tre utilise que dans les fonctions membres.

Mot cl THIS
Exemple
class Point { private:

this dfinit
implicitement
public:

int x; int y; Point(); Point(int, int); ~Point(); void setX(int); void setY(int); }; Point :: Point(){ x=0; y=0;} Point :: Point(int x,int y){

Variable locale

this->x=x; this->y=y;}

Point :: ~Point(){ cout<<"cest fini"; } void Point :: setX(int x){

this->x=x;
} void Point :: setY(int y){

Variable membre

Pointeur

this->y=y;
}

Exercice: constructeur/destructeur
Crer les classes suivantes. Les interfaces sur des fichiers .h et les implmentations sur .cpp
Client - num_client - nom - prenom -CIN - CompteBancaire + Client() + Client(num_clien) + Client(num_client, nom, prenom) + Client(CompteBancaire) /* ajoutez les accesseurs et les modificateurs */

CompteBancaire - Num_compte - solde + CompteBancaire(num_compte) /* ajoutez les accesseurs et les modificateurs */

Crer la fonction main pour tester les classes

Surcharge des fonctions


La surcharge est lune des nouvelles fonctionnalits du C++ (rutilisabilit) Elle permet dattribuer le mme nom plusieurs oprateurs ou fonctions Lambigut est leve grce au contexte (nombre et/ou type des paramtres passs en arguments) Une dfinition spare est ncessaire pour chacun des profiles

Surcharge des fonctions


Exemple int max(int a, int b); int max(int *tab, int taille); int max(int a, int b, int c); int afficher(int a, int b); int afficher(int *tab, int taille); void afficher(int a, int b); // Interdit La valeur de retour ne permet pas de diffrencier entre les fonctions surcharges

Exercice
On peut dfinir des fonctions de mme nom mais se diffrentiant par le nombre et le type d'arguments. Le systme choisira la fonction appeler selon les arguments.
Additionneur - somme: int - somme: float - somme: double /* surcharge de la mthode somme */

Lhritage
Lhritage est lun des fondamentaux de la programmation oriente objet Il est la base des possibilits rutilisation des composants logiciels. de

Il permet une drivation dune classe en une classe drive plus spcialise.

Lhritage
Spcifications Classe Drive = Spcifications Classe Anctre + Nouvelles Spcifications Hritage des donnes et des fonctions membres sauf:
Les constructeurs et destructeurs de l'anctre

Introduction d'un nouveau statut: protected


membre ne pouvant tre utilis que par les fonctions membres de la classe et de celles qui en seront drives

Lhritage
Par exemple :
On possde une classe Article comportant les attributs suivants (nom, prixBrut, quantit).

On peut trs bien construire une classe Boisson partir de cette classe en y ajoutant uniquement un attribut supplmentaire (volume)

Lhritage
La drivation de classe est la technique qui consiste faire hriter une classe dune autre classe. On dit quune classe B est drive dune classe A si elle en hrite. A est alors appele la superclasse ou la classe de base de la classe B Syntaxe d'hritage
class nom_nouvelle_classe : type hritage nom_anctre {};

Lhritage
Exemple
class Point3D : public Point { private: int z; public: Point3D(); Point3D(int,int,int); ~Point3D(); void setZ(int); int getZ(); };

Appel du constructeur de la classe mre

Appel du constructeur de la classe mre

Point3D::Point3D():Point(){ this->z=0; } Point3D::Point3D(int x,int y,int z):Point(x,y){ this->z=z; }

Lhritage
Type d'hritage
Rgles de drivation de classe
mode de drivation private statut du membre dans la classe anctre
private protected public private protected public private protected public

statut du membre dans la classe drive


inaccessible private private inaccessible protected protected inaccessible protected public

protected

public

Lhritage
Lors de la construction dun objet, tous les constructeurs de la hirarchie dhritage sont automatiquement appel du plus gnral au plus particulier. Lors de la destruction les destructeurs de la hirarchie sont appel du plus spcifique au plus gnral. Il est possible de redfinir des mthodes de la classe mre dans une classe fille. Lentte de la mthode doit tre identique loriginale. La mthode initiale reste utilisable mais il faut la prfixer par le nom de la classe dans laquelle elle a t dfinie.

Exercice
placer la dfinition de la classe dans un fichier header (.h ou hpp) et son implmentation dans un fichier de mme nom mais d'extension (.cpp). Tester la classe Employe Personne

Employe - immaricule - salaire - echelle /* constructeurs, accesseurs et les modificateurs */

strcpy(distination,source): permet de copier une chane de caractre.(String.h) strlen(char*): fonction que retourne la taille dun chane de caractre.

Lhritage Multiple
En C++ une classe peut hrite de plusieurs classe en mme temps: Hritage multiple.

Syntaxe d'hritage Multiple


class nom_classe_fille

, type_hritage nom_anctre, type_hritage nom_anctre,


type_hritage nom_anctre {};

Lhritage Multiple
Exemple
A int a A(int a){this->a=a;} Afficher{cout<<a;} int b A(int b){this->b=b;} Bfficher{cout<<b;} main{ C c(1,2,3); c.Afficher(); c.Bfficher(); c.Cfficher(); } B

C : public A, public B int c

Le programme affiche : C(int a, int b,int c) : A(a) , B(b) {this->c=c;} Cfficher{cout<<c;} 123

Lhritage Multiple
Exemple
A int a somme(int a,intb){ a+b; } int b somme(int a,intb){ a+b; } C c(1,2,3); c.somme(); } Ambigut C : public A, public B Le nom de la fonction ne permet pas de dire laquelle des deux fonctions doit tre appele. Il faut donc spcifier le chemin d'accs compltement. main{ C c(1,2,3); c.A::somme(); c.B::somme(); } B main{

Hritage Virtuel
Z A : public Z B : public Z

C : public A, public B A et B drivent dune mme troisime Z, une drivation de A et B placera dans la classe drive C deux copies de Z.

Il est possible dviter ce comportement lorsquil nest pas ouhaitable. Il faut pour cela que les classes A et B aient t drives de manire virtuelle de Z

Hritage Virtuel
Z A : virtual public Z B : virtual public Z

C : public A, public B

La classe C dans ce cas ne contient quune instance de Z. Les classes A et B sont identiques ce quelles taient auparavant, sauf que le compilateur sait que linstance de Z peut tre un emplacement inhabituel (cest le cas dans C); les deux classes doivent tre drives virtuellement de Z.

Exercice
Personne Etudiant Enseignant Etudiant_Enseignant Etudiant ayant les mmes caractristiques qu'une Personne plus une liste de matires suivies et un ensemble de notes. On doit pouvoir obtenir la liste des matires, affecter une note, calculer la moyenne. Enseignant ayant les mmes caractristiques qu'une Personne plus une liste de matires enseignes, un nombre d'heures par matire et un tarif horaire. On doit pouvoir obtenir les matires, faire un calcul du nombre d'heures total et dterminer le cot de l'enseignant. On dfinit une classe Etudiant_Enseignant qui hrite des classes Etudiant et Enseignant afin de caractriser un tudiant qui donnerait des cours.

Fonction Virtuel
A
class A{ public: void saisir(); }; void A::saisir(){ cout <<" classe A" ; }

B
Class B : public A { public: void saisir(); }; void B::saisir(){ cout <<" classe B" ; }

A
class A{ public:

B
virtual void
Class B : public A { public: void saisir(); }; void B::saisir(){ cout <<" classe B" ; }

saisir(); }; void A::saisir(){ cout <<" classe A" ; }

Main
int main(){ B b; A *a=&b;

Main

int main(){ B b; A *a=&b;

A->saisir(); b.saisir();
}

A->saisir();
}

b.saisir();

Pour viter ce comportement, il faut dire la classe A que sa mthode f est susceptible d'tre redfinie par ses classes drives. On parle alors de mthode virtuelle.

Les Amis
On a vu que le masquage des donnes impliquait un accs impossible aux membres privs ou protgs dune classe par une autre classe indpendante. Dans certain cas, il est utile davoir accs aux membres privs dune autre classe sans changer le masquage. Pour cela nous allons utiliser des fonctions amies Lamiti autorise laccs tous les membres privs La dclaration se fait par le mot cl friend

Les Amis
Il existe plusieurs situation damiti :
Fonction indpendante, amie dune classe Fonction membre dune classe amie dune autre classe Fonction amie de plusieurs classes Toute les fonctions membres dune classe, amies dune autre classe

Fonction indpendante, amie dune classe


Exemple
Tableau.h
class Tableau { private: int * tab; int nbr;

Autre.h
#include<iostream> using namespace std; void afficher (Tableau t){ cout<<" [" ; for( int i=0 ; i < t "; cout<<" ]" ; }

Variable prive

friend void afficher (Tableau); // ici


public: Tableau(int nombre); ~Tableau(); friend void afficher (Tableau); //

.nbr ; i++) cout<<t.tab[i] <<"

Variable prive

ou ici
};

Tableau.cpp
#include"Tableau.h" Tableau::Tableau(int nombre){ nbr = nombre; tab=new int[nombre]; } Tableau::~Tableau(){ delete tab; }

Main.cpp
#include "Tableau.h" #include "Autre.h" int main(){ Tableau T(5); Afficher(T); }

Ce nest plus une fonction membre de point. Lemplacement de la dclaration damiti est indiffrent.

Fonction membre dune classe, amie dune autre classe


Exemple
Main
class Tableau; class Calcule{ public: Calcule(); int somme(Tableau); }; class Tableau { private: int * tab; int nbr; public: Tableau(int nombre); ~Tableau(); void remplire(); friend int Calcule::somme(Tableau); friend void afficher(Tableau); }; Int main(){ Calcule c; Tableau T(5); afficher(T); cout<<c.somme(T); }

Dclaration de Tableau Dfinition de Calcule Dfinition de Tableau

Fonction amie de plusieurs classes


Exemple

Cest le mme principe que pour une mthode non membre, amie dune classe. Par exemple :
on met friend void f(A,B); dans les deux classes A et B. On dfinit ensuite la fonction void f(A...,B...) o lon veut.

Toute les fonctions membres dune classe, amies dune autre classe
Cest une gnralisation du cas fonction membre, amie dune autre classe. On pourrait dclarer amie toutes les mthodes concernes. Il est plus simple de placer dans la classe A linstruction suivante : friend class B; Dans ce cas toutes les fonctions membres de la classe B sont amies de la classe A.

Toute les fonctions membres dune classe, amies dune autre classe
Exemple
On utilise la notion dami lorsque lon a deux classes dont lune doit avoir accs aux donnes membres prives de lautre. Cette faon de faire permet de limiter une seule classe laccs des donnes prives et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe.
#include <iostream> using namespace std; void B::change(A &a) { a.i = 145; } void B::affiche(A a) { void change (A&); void affiche(A); }; class A { int i; int main() { A a(5); B b; b.affiche(a); b.change(a); b.affiche(a); return 0; } cout << a.i << endl;

class A;
class B { public:

//prive
}

friend class B;
public: A(int a){i=a;}; };

Faites attention l'ordre des dclarations et des dfinitions !!!!!

Surcharge des oprateurs


En C++ on peut redfinir la smantique des oprateurs du langage, soit pour les tendre des objets, alors qui ntaient initialement dfinis que sur des types primitifs, soit pour changer l'effet d'oprateurs prdfinis sur des objets. Cela s'appelle surcharger des oprateurs.

pour surcharger un oprateur dfinir une fonction nomme

operator.

Il n'est pas possible d'inventer de nouveaux oprateurs ; seuls des oprateurs dj connus du compilateur peuvent tre surchargs. Tous les oprateurs de C++ peuvent tre surchargs, sauf les cinq suivants :

.*

::

sizeof

Surcharge des oprateurs


Exemple + , - , / , * , += , -= , /= , *= complexe float reel float img Complexe& operator + (complexe c); complexe& operator - (complexe c); Complexe& operator * (complexe c); Complexe& operator / (complexe c); Complexe& operator += (complexe c); Complexe& operator - =(complexe c); Complexe& operator *= (complexe c); Complexe& operator /= (complexe c); afficher(); complexe operator + (complexe c){ return complexe(this->reel+reel, this->img+c.img); }

Surcharge des Oprateurs


Exemple << et >>
complexe float reel float img . friend ostream& operator<<(ostream&, complexe); friend istream& operator>>(istream&, complexe); ostream& operator << (ostream& out,Complexe c) { out<<c.re<<" "<<c.im; return out; }

Les Exceptions
Une exception est linterruption de lexcution du programme la suite dun vnement particulier. Le but des exceptions est de raliser des traitements spcifiques aux vnements qui en sont la cause. Ces traitements peuvent rtablir le programme dans son mode de fonctionnement normal, auquel cas son excution reprend. Il se peut aussi que le programme se termine, si aucun traitement nest appropri. Le C++ supporte les exceptions logicielles, dont le but est de grer les erreurs qui surviennent lors de lexcution des programmes. Lorsquune telle erreur survient, le programme doit lancer une exception. Lexcution normale du programme sarrte ds que lexception est lance, et le contrle est pass un gestionnaire dexception. Lorsquun gestionnaire dexception sexcute, on dit quil a attrap lexception.

Les Exceptions
try{
// Code susceptible de gnrer des exceptions

} catch(classe & e ){
//Traitement de lexception associe la classe

Les Exceptions
Exemple
Main erreur
int cause erreur(int c):cause(c){} erreur(erreur &source) : cause(source.cause) {} int i; cout << "Tapez 0 pour gnrer une exception Erreur et 1 pour une Entire :"; cin >> i; cout << endl; try { switch (i) { case 0:{ erreur a(0);

throw (a);
} case 1:{

autre

int a=1; throw (a); autre c; throw (c);

} default:{

} }

Equivalence
erreur(int c):cause(c){} erreur(int c){cause=c;} erreur(erreur &source) : cause(source.cause) {} erreur(erreur &source) {cause=source.cause;}

} catch (erreur &tmp) { // Exception de type erreur cout << "Erreur erreur ! (cause " << tmp.cause << ")" << endl; } catch (int tmp) { // Exception de type int cout << "Erreur int ! (cause " << tmp << ")" << endl; } catch (...) { // Toutes les autres Exceptions cout << "Exception inattendue !" << endl; }

Les Exceptions
Autres exception dans C++
Nom de la classe bad_alloc bad_cast bad_exception bad_typeid ios_base::failure EXEMPLE: catch(bad_alloc e){cout<<e.what();} La fonction what affiche lerreur gnr par le programme Description Lance s'il se produit une erreur lors d'un new. Lance s'il se produit une erreur lors d'un chec dans une rfrence. Lance si aucun catch ne correspond un objet lanc. Lance s'il se produit une erreur lors d'un typeid. Lance s'il se produit une erreur avec un flux (iostream).

Exercice: Exception
Crer les 3 classes suivantes: creer_vecteur
public int er creer_vecteur(int);

limite_vecteur
public int er limite_vecteur(int);

vecteur
int nbreElement int* vect vecteur(int); main (){ ~vecteur(); try{ int & operator [] (int)) vecteur v(-3) ; // Exception crer_vecteur v[11] = 5 ; // Exception limite_vecteur } catch (limite_vecteur lv){ cout << "Exception indice " << lv.er << " hors limites \n" ; exit (-1) ; } catch (creer_vecteur cv){ cout << " Exception creation vecteur nb elem = " << cv.er << "\n" ; exit (-1) ; } }

La classe string
Les objet de la classe string sont des conteneurs des caractres, spcifiquement conus pour oprer des squences de caractres (chane de caractres). La classe string est un type simple utiliser, sr, complet et performant pour le traitement des chanes de caractres, presque toujours trs largement prfrable au pnible type char * de C.

La classe String
Mthodes Dclaration
String ch("Bonjour");

ch.length() : renvoie la langueur de ch ch.max_size() : ch.compare("bjr") : comparaison de deux chane (renvoie-1) ch += "BB" : ch est BonjourBB, cest la concatnation ch.insert(4,"AA") : ch est BonjAAourBB ch.erase(4,2) : ch est BonjourBB ch[4]='? : ch est Bonj?ourBB ch.replace(3,5,"soir") : ch est BonsoirBB

La classe String
Mthodes
ch.find("abc") : recherche de la sous chane "abc" (1 si oui) ch.rfind("abc") :recherche de la sous chane depuis la fin ch.find_first_of(a') :premire occurrence du caractre a ch.find_last_of(x') : dernire occurrence du caractre x substr(2,4) :extraction de 4 caractres partir 2me caractre ch.c_str() : obtention de la rfrence.

String ch; on tape : Bonjour ! def


getline(cin,ch) ch= Bonjour ! Def getline(cin,s,'!'); ch= Bonjour

Gestion des fichiers


classes ofstream/ifstream

Les fichiers ouverts par association avec une variable de type ofstream (lecture avec ifstream) sont buffriss. Ce mcanisme permet au systme dobtenir une excution plus rapide en gardant en mmoire les critures demandes, et en les effectuant en bloc , lorsque le volume de donnes transfrer es suffisant.

Gestion des fichiers


classes ofstream/ifstream

Il arrive que cette faon de fonctionner poses des problmes, notamment lorsquune fonction cherche lire dans un fichier des donnes qui ny ont pas encore t rellement crites !!!!
Void demo(){ ofstream fichier ("essai.txt"); if(!fichier) return; fichier<< 123456789; maFonction(); } Cration dun fichier + criture Void maFonction(){ ifstream fichier ("essai.txt ") int chiffre; if(fichier) fichier>> chiffre; // lecture choue } Lecture des donnes

Gestion des fichiers


classe ofstream/ifstream Pour forcer le systme effectuer les critures en attente, on peut fermer explicitement le fichier par close(), avant dappeler maFonction(), ou utiliser les manipulateru flush. Remplaons nous la ligne:
fichier << 123456789;
Par

fichier << 123456789<<flush;

Le manipulateur endl, lui aussi provoque le transfert des donnes en attente


fichier << 123456789<<endl;

Gestion des fichiers


ouverture en criture
ofstream fichier(nom_fichier, [mode]); Les modes d'ouverture sont :
ios::out (pour output) : spcifie qu'on ouvre le fichier en criture. par dfaut ios::app (pour append = ajouter la suite) : lorsqu'on ouvre le fichier en criture, on se trouve la fin pour crire des donnes la suite du fichier ios::trunc (pour truncate = tronquer) : lorsqu'on ouvre le fichier en criture, spcifie qu'il doit tre effac s'il existe dj, pour laisser un fichier vide ; ios::ate (pour at end) : ouvre le fichier en criture et positionne le curseur la fin de celui-ci. La diffrence avec ios::app est que si on se repositionne dans le fichier, l'criture ne se fera pas forcment la fin du fichier, contrairement ios::app.

Pour spcifier plusieurs modes d'ouverture, on utilise l'oprateur "ou" : |


Exemple: ofstream fichier("essai.txt", ios::out |ios::trunc);

Gestion des fichiers


ouverture en lecture

Louverture dun fichier en lecture est simplement faite par:


ifstream fichier(nom_fichier, [ios::in]) Ios::in: mode par dfaut.

Exemple:
ifstream fichier("essai.txt",ios::in) Ou ifstream fichier("essai.txt")

Gestion des fichiers


Mthode utiles: lecture

Il y a plusieurs mthodes qui permet de lire les lignes, le caractres et les chiffres qu'il faut employer en fonction de ce que l'on veut faire
getline(flux, chaineDeCaractres) : lire une ligne complte flux.get(caractre) : lire un caractre flux >> variable : pour rcuprer partir du fichier jusqu' un dlimiteur (espace, saut la ligne, ...).

Gestion des fichiers


Exemple
string contenu; getline(fichier, contenu); //lecture dune ligne

string ligne; while(getline(fichier, ligne)) { cout << ligne << endl;} //lecture dun fichier

char caractere; fichier.get(caractere); cout << caractere; // lecture dun caractre int i, j; string s1, s2; fichier >> i >> j >> s1 >> s2; //lecture jusqu' l'espace

Gestion des fichiers


Mthodes utiles: criture

Pour l'criture:
flux << var : crit dans le fichier le variable var de nimporte quel type (string, int, ...) ; flux.put(caractre) : crit un seul caractre dans le fichier.

Exemple
string CIN = "AB 111111"; int age = 22; fichier << "Num CIN : " << CIN<< endl; fichier << "age: " << age << endl;

Gestion des fichiers


Accs et dplacement

Ifstream:
tellg() : savoire la position courant en octets Seekg(nombre_octets, position)

Ofstream
tellp(): savoire la position courant en octets seekp(nombre_octets, position)

Pour la position:
ios::beg ios::cur ios::end Dbut de fichier (beginning) La position disertion actuelle(current) La fin du fichier

Gestion des fichier


autres mthodes utiles
fichier.eof() : pour la fin du fichier (renvoie true si la fin de fichier); fichier.ignore(nbCaractere, caractereDeFin) pour ignorer nbCaractere lu OU ignorer tout jusqu' ce que caractereDeFin est rencontr fichier.clear() pour remettre les flags (comme eof) d'tat leur tat d'origine fichier.fail() pour tester si l'ouverture du flux s'est bien droule. Trs utile pour vrifier qu'un fichier existe ( si false le fichier est bien crer et ouvert)

Les patrons : Template


Avec les patrons (template), on va pouvoir paramtrer des classes et des fonctions par des types (programmation gnrique ).

Template: Fonction
Dclaration
template <class identifier>declaration_fonction; template <nomType identifier>declaration_fonction;

Les deux dclaration sont valide et non distinct mme avec le mot class

Template: Fonction
Exemple
double getMax (double a, double b) { return (a>b?a:b); } int getMax (int a, int b) { return (a>b?a:b); }

Pour chaque type de donne il faut dclar une fonction qui lui convient. template <class T> T getMax (T a, T b) { return (a>b?a:b); }
int main () { int i=5, j=6, k; long l=10, m=5, n; k=getMax(i,j); n=getMax(l,m); cout << k << endl; cout << n << endl; return 0; }

laide des templates on implmente une seul fonction pour touts les types

int main () { int i=5, j=6, k; long l=10, m=5, n; k=getMax<int>(i,j); n=getMax<long>(l,m); cout << k << endl; cout << n << endl; return 0; }

Template: fonction
Exemple

En cas de comparaison de deux types diffrents double et int :


template <class T, class U> T getMax (T a, U b) { return (a>b?a:b); }

int i,j; long l; i = getMax<int,long> (j,l);

ou simplement

i = getMax (j,l)

Template: Class
Comme les fonctions templates, les classes aussi peuvent tre des templates. Dclaration
template <class nom_type > class nom_class{};

Template: Class
Exemple
#include <iostream> using namespace std; template <class T> class point { private : T x,y; public: point (T a, T b) { x=a; y=b; } T getX (); double centre(); }; template <class T> T point<T>::getX (){ return x; } template <class T> double point<T>::centre(){ return ((x+y)/2); }

int main () { point <int> p(100, 75); cout << p.getX(); return 0; }