Upload
yvon-gomes
View
107
Download
2
Embed Size (px)
Citation preview
HistoriqueHistoriqueHistoriqueHistorique 19851985
Langage C++, parution du livre Bjarne StroustrupLangage C++, parution du livre Bjarne Stroustrup
http://www.research.att.com/~bs/homepage.html http://www.research.att.com/~bs/homepage.html 1998 Normalisation ANSI du langage C++1998 Normalisation ANSI du langage C++ Livre de cours : Programmer en C++ ,Claude DelannoyLivre de cours : Programmer en C++ ,Claude Delannoy
EyrollesEyrolles
Chapitre 1Chapitre 1Chapitre 1Chapitre 1
Spécificités du Langage C++Spécificités du Langage C++Spécificités du Langage C++Spécificités du Langage C++
Spécificité du langageSpécificité du langageLes variables déclarées constantesLes variables déclarées constantesSpécificité du langageSpécificité du langageLes variables déclarées constantesLes variables déclarées constantes const const int i = 5;int i = 5;La variable i ne peut pas être modifiée.La variable i ne peut pas être modifiée.
int * constint * const ip = &i; ip = &i; La variable ip ne peut pas être modifiée, La variable ip ne peut pas être modifiée, mais son contenu *ip = 8 oui.mais son contenu *ip = 8 oui.
const int const int * ip = &i ;* ip = &i ;La variable ip = &j peut être modifiée mais La variable ip = &j peut être modifiée mais son contenu *ip ne peut pas être modifié.son contenu *ip ne peut pas être modifié.
const int * constconst int * const ip = &i; ip = &i; ip et *ip ne peuvent pas être modifieésip et *ip ne peuvent pas être modifieés
Spécificité du langageSpécificité du langageLa notion de référence.La notion de référence.Spécificité du langageSpécificité du langageLa notion de référence.La notion de référence. int i = 5 ;int i = 5 ; int &j = i ;int &j = i ;
j est une référence sur i cela veut dire que la j est une référence sur i cela veut dire que la variable i a deux noms i et jvariable i a deux noms i et j
const int i = 5;const int i = 5; On ne peut pas définir une référence sur une On ne peut pas définir une référence sur une
variable déclarée constante .variable déclarée constante . int & j = i; ou int & j = 2 ;int & j = i; ou int & j = 2 ; ===> erreur du ===> erreur du
compilateur.compilateur.
Par contre on peut déclarer constante la Par contre on peut déclarer constante la référence:référence:
const int & j = i ;const int & j = i ;
Spécificité du langageSpécificité du langagePrototypage ObligatoirePrototypage ObligatoireSpécificité du langageSpécificité du langagePrototypage ObligatoirePrototypage Obligatoire Il faut mettre en dIl faut mettre en déébut de programme la liste des but de programme la liste des
prototypes de fonctions appeléesprototypes de fonctions appelées Exemple :Exemple :
#include <iostream.h>#include <iostream.h>
int main ()int main () {{ float AireRectangle(float,float);float AireRectangle(float,float);
float Longueur = 10.; float Longueur = 10.; float Largeur=5.;float Largeur=5.; float Aire = AireRectangle(Longueur,Largeur); float Aire = AireRectangle(Longueur,Largeur); }}
float AireRectangle(float L , floatl )float AireRectangle(float L , floatl ){{ … …
bbaa bb
Spécificité du langageSpécificité du langagePassage des arguments par valeur.Passage des arguments par valeur. Spécificité du langageSpécificité du langagePassage des arguments par valeur.Passage des arguments par valeur.
Exemple :Exemple :
#include <stdio.h>#include <stdio.h>
void Echange (int a, int b)void Echange (int a, int b){{ int c; int c; c=a; a=b; b=c; c=a; a=b; b=c;}}
int main()int main(){{ void Echange (int , int ); void Echange (int , int );
int A, B;int A, B; A=1; B=2; A=1; B=2; Echange (A,B); Echange (A,B); cout << “ A = “ << A << “ B = “ << B << endl; cout << “ A = “ << A << “ B = “ << B << endl;}}
A=1, B=2A=1, B=2
AA BB
bbaa bb
Spécificité du langageSpécificité du langagePassage des arguments par adresse.Passage des arguments par adresse.Spécificité du langageSpécificité du langagePassage des arguments par adresse.Passage des arguments par adresse.
Exemple :Exemple :
#include <stdio.h>#include <stdio.h>
void Echange (int * ap, int * bp)void Echange (int * ap, int * bp){{ int c; int c; c=*ap; *ap=*bp; *bp=c; c=*ap; *ap=*bp; *bp=c;}}int main()int main(){{ void Echange (int *, int *) void Echange (int *, int *) int A, B; int A, B; A=1; B=2; A=1; B=2; Echange (&A,&B); Echange (&A,&B); cout << “ A = “ << A << “ B = “ << B << endl; cout << “ A = “ << A << “ B = “ << B << endl;}}
BA B
22A
11B
22A
11
&A
B
22A
11B
22A
11
&B&A
B
22A
11B
22A
11
&B
ap bp
&A
B
22A
11B
22A
11
&B
ap bp
c
&A
B
22A
11B
11A
22
&B
ap bp
c
11
&A
B
22A
11B
11A
22
&B
A=2, B=1A=2, B=1
Spécificité du langageSpécificité du langagePassage des arguments par référence.Passage des arguments par référence.Spécificité du langageSpécificité du langagePassage des arguments par référence.Passage des arguments par référence.
#include <iosteam>#include <iosteam> namespace std ;namespace std ;
void Echange (int & a, int & b)void Echange (int & a, int & b){{ int c; int c; c=a; a=b; b=c; c=a; a=b; b=c;}}
int main()int main() {{
void Echange (int & , int & ) void Echange (int & , int & ) int A, B;int A, B;
A=1; B=2; A=1; B=2; Echange (A,B); Echange (A,B); cout << “ A = “ << A << “ B = “ << B << endl; cout << “ A = “ << A << “ B = “ << B << endl;}}
c
11
A=2, B=1A=2, B=1
AA BB bbAA BB
Spécificité du langageSpécificité du langage Problème du passage des argumentsProblème du passage des argumentsSpécificité du langageSpécificité du langage Problème du passage des argumentsProblème du passage des arguments
Si un argument est passé par valeur : Si un argument est passé par valeur :
la fonction travaille sur une copie, la variable passée est la fonction travaille sur une copie, la variable passée est protégée donc en mode INprotégée donc en mode IN
Si un argument est passé par référence : Si un argument est passé par référence :
la fonction travaille sur la variable sans recopie, la la fonction travaille sur la variable sans recopie, la variable passée n’ est pas protégée donc en mode OUT.variable passée n’ est pas protégée donc en mode OUT.
Si on veut éviter une recopie de l’argument et protéger Si on veut éviter une recopie de l’argument et protéger sa valeur : on utilise le qualificatif sa valeur : on utilise le qualificatif constconst
Exemple: Fonction ( const int & )Exemple: Fonction ( const int & )
Spécificité du langageSpécificité du langageValeurs des arguments d’une fonction par Valeurs des arguments d’une fonction par défaut.défaut.
Spécificité du langageSpécificité du langageValeurs des arguments d’une fonction par Valeurs des arguments d’une fonction par défaut.défaut.
On peut donner des valeurs par défaut aux arguments d’une On peut donner des valeurs par défaut aux arguments d’une fonction au niveau de son prototype:fonction au niveau de son prototype:int main ()int main (){{
void AireRectangle ( float = 1 , float = 1 ) ;void AireRectangle ( float = 1 , float = 1 ) ;// Appel de la fonction avec les arguments par défaut.// Appel de la fonction avec les arguments par défaut.
AireRectangle ( ); // Résultat 1.*1. AireRectangle ( ); // Résultat 1.*1. // Appel de la fonction avec un argument par défaut.// Appel de la fonction avec un argument par défaut. AireRectangle (5.); // Résultat 5.*1.AireRectangle (5.); // Résultat 5.*1.// Appel de la fonction avec ses arguments donnés.// Appel de la fonction avec ses arguments donnés. AireRectangle (2.,3.); // Résultat 2.*3.AireRectangle (2.,3.); // Résultat 2.*3.}}
Spécificité du langageSpécificité du langageValeurs des arguments d’une fonction par Valeurs des arguments d’une fonction par défaut.défaut.
Spécificité du langageSpécificité du langageValeurs des arguments d’une fonction par Valeurs des arguments d’une fonction par défaut.défaut.
Règle 1: Les arguments par défaut sont donnés de droite à Règle 1: Les arguments par défaut sont donnés de droite à gauche:gauche:
void Fonction ( int , float =2.,int=1) ; // void Fonction ( int , float =2.,int=1) ; // OK correctOK correct void Fonction ( int =1, float = 2. , int ) ; // void Fonction ( int =1, float = 2. , int ) ; // Erreur CompilationErreur Compilation
Règle 2: La séquence de valeurs par défaut est continue sans Règle 2: La séquence de valeurs par défaut est continue sans interruption.interruption.
void Fonction ( int = 1 , float ,int=2) ; // void Fonction ( int = 1 , float ,int=2) ; // Erreur CompilationErreur Compilation
Spécificité du langageSpécificité du langageSurdéfinition des fonctionsSurdéfinition des fonctionsSpécificité du langageSpécificité du langageSurdéfinition des fonctionsSurdéfinition des fonctions
Deux fonctions peuvent avoir le même nom mais pas la même Deux fonctions peuvent avoir le même nom mais pas la même liste d’arguments:liste d’arguments:
Exemple :Exemple : int Maximum ( int i, int j);int Maximum ( int i, int j); float Maximum ( float x , float y ) ;float Maximum ( float x , float y ) ; Une fonction se distingue par sa liste d’arguments.Une fonction se distingue par sa liste d’arguments. On dit que la fonction est surdéfinie.On dit que la fonction est surdéfinie. On peut surdéfinir une fonction autant de fois que l’on veut.On peut surdéfinir une fonction autant de fois que l’on veut.
Spécificité du langageSpécificité du langage Les opérateurs d’allocation et de destruction Les opérateurs d’allocation et de destruction dynamiques de la mémoire dynamiques de la mémoire
Spécificité du langageSpécificité du langage Les opérateurs d’allocation et de destruction Les opérateurs d’allocation et de destruction dynamiques de la mémoire dynamiques de la mémoire
Les opérateurs Les opérateurs new new et et new []new []réserve de la mémoireréserve de la mémoire Exemple int * ip = Exemple int * ip = newnew int; int; int * itab = int * itab = newnew intint[[1010]];;
Les opérateurs Les opérateurs deletedelete et et delete[]delete[] libèrent cette zone libèrent cette zone mémoire.mémoire.
Exemple Exemple deletedelete ip ; ip ; delete []delete [] itab ; itab ;
Nécessairement Nécessairement newnew ==> ==> deletedelete et et new[]new[] ==> ==> delete[]delete[]
Chapitre 2Chapitre 2Chapitre 2Chapitre 2
Définition d’une classe.Définition d’une classe.Définition d’une classe.Définition d’une classe.
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
• Couplage des données et des fonctions ( appelées méthodes ou fonctions membres)
La notion de classe en C++ est une extension de la notion de structure du C avec les concepts fondamentaux suivants:
• Encapsulation des données, statut privé ( Ces données privées ne peuvent être manipulées que par les méthodes de la classe)
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
classclass Point Point {{
private:private:
float x;float x;
float Y;float Y;
public:public:
Initialise ( float , float ) ;Initialise ( float , float ) ;
void Affiche();void Affiche();
};};
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
La classe est définie dans un fichier d ’extension .h ou .hxxLa classe est définie dans un fichier d ’extension .h ou .hxx
exemple: Point.hxxexemple: Point.hxx
Les fonctions membres seront définies dans un fichier Les fonctions membres seront définies dans un fichier d ’extension .cxx, .C, .cc, .cpp d ’extension .cxx, .C, .cc, .cpp
exemple: Point.cxxexemple: Point.cxx
Les fonctions sont rattachées à la classe par l ’opérateur de portée :: Les fonctions sont rattachées à la classe par l ’opérateur de portée ::
Exemple: void Point::Initialise( float a ,float b)Exemple: void Point::Initialise( float a ,float b)
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classeifndef POINTifndef POINT
#define POINT#define POINT
class Pointclass Point
{{
private :private :
float x ;float x ;
float y ;float y ;
public :public :
void Initialise ( float = 0 , float = 0 ) ;void Initialise ( float = 0 , float = 0 ) ;
void Affiche (void) ;void Affiche (void) ;
} ;} ;
#endif#endif
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe#include "Point.hxx"#include "Point.hxx"
#include <iostream.h>#include <iostream.h>
void Point::Affiche(void )void Point::Affiche(void )
{{
cout << "x = " << x << endl ;cout << "x = " << x << endl ;
cout << "y = " << y << endl ;cout << "y = " << y << endl ;
}}
void Point::Initialise(float a , float b)void Point::Initialise(float a , float b)
{{
x=a;x=a;
y=b;y=b;
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
#include "Point.hxx"#include "Point.hxx"
int main ()int main ()
{{
int code_error = 1 ;int code_error = 1 ;
Point P;Point P;
P.Initialise(3,4);P.Initialise(3,4);
P.Affiche() ;P.Affiche() ;
return code_error;return code_error;
} }
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Première approche du constructeur: Initialiser les données au moment Première approche du constructeur: Initialiser les données au moment
de l ’instanciation. Le constructeur porte le même nom que la classe etde l ’instanciation. Le constructeur porte le même nom que la classe et
ne possède pas de variable de retour.ne possède pas de variable de retour.
Au choix du concepteur, les données (ou attributs), les fonctions Au choix du concepteur, les données (ou attributs), les fonctions membres (ou méthodes) peuvent être déclarées sous le statut public ou membres (ou méthodes) peuvent être déclarées sous le statut public ou private.private.
Les méthodes déclarées sous le statut public constitue l ’interface Les méthodes déclarées sous le statut public constitue l ’interface utilisateur de la classe et définissent les niveaux d ’accessibilité des utilisateur de la classe et définissent les niveaux d ’accessibilité des données qui doivent être déclarées sous le statut private.données qui doivent être déclarées sous le statut private.
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classeifndef POINTifndef POINT
#define POINT#define POINT
class Pointclass Point
{{
private :private :
float x ;float x ;
float y ;float y ;
public :public :
Point( float = 0 , float = 0 ) ;Point( float = 0 , float = 0 ) ;
void Initialise ( float = 0 , float = 0 ) ;void Initialise ( float = 0 , float = 0 ) ;
void Affiche (void) ;void Affiche (void) ;
} ;} ;
#endif#endif
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe#include "Point.hxx"#include "Point.hxx"
#include <iostream.h>#include <iostream.h>
Point::Point(float a , float b):x(a),y(a)Point::Point(float a , float b):x(a),y(a)
{{
}}
void Point::Affiche(void )void Point::Affiche(void )
{{
cout << "x = " << x << endl ;cout << "x = " << x << endl ;
cout << "y = " << y << endl ;cout << "y = " << y << endl ;
}}
void Point::Initialise(float a , float b)void Point::Initialise(float a , float b)
{{
x=a;x=a;
y=b;y=b;
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
#include "Point.hxx"#include "Point.hxx"
int main ()int main ()
{{
int code_error = 1 ;int code_error = 1 ;
Point P(1,2);Point P(1,2);
P.Affiche() ;P.Affiche() ;
P.Initialise(3,4);P.Initialise(3,4);
P.Affiche() ;P.Affiche() ;
return code_error;return code_error;
} }
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Constructeurs et destructeurs sont indispensables si la classe possède Constructeurs et destructeurs sont indispensables si la classe possède des objets ou tableaux dynamiques.des objets ou tableaux dynamiques.
C ’est dans le constructeur que se fera l ’allocation dynamique C ’est dans le constructeur que se fera l ’allocation dynamique par les opérateurs new ou new [].par les opérateurs new ou new [].
C ’est dans le destruteur que se fera la libération de la zone C ’est dans le destruteur que se fera la libération de la zone mémoire dynamique par les opérateurs delete mémoire dynamique par les opérateurs delete
ou delete [].ou delete [].
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
##ifndefifndef Vecteur_HeaderFile Vecteur_HeaderFile
#define#define Vecteur_HeaderFile Vecteur_HeaderFile
classclass Vecteur Vecteur
{{
private:private:
int N;int N;
float * Coord;float * Coord;
public:public:
Vecteur( int = 0 , float * = NULL);Vecteur( int = 0 , float * = NULL);
~Vecteur();~Vecteur();
void Affiche();void Affiche();
void Initialise(float *=NULL) ;void Initialise(float *=NULL) ;
} } ;;
#endif#endif
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe#include#include "Vecteur.hxx " "Vecteur.hxx "
#include #include <iostream.h><iostream.h>
Vecteur::VecteurVecteur::Vecteur((intint n n , , float *float * A)A)
{{
cout cout << " Constructeur usuel " << << " Constructeur usuel " << endl;endl;
ifif ( n == 0 )( n == 0 )
{{
Coord = NULL ;Coord = NULL ;
N= 0 ;N= 0 ;
}}
elseelse
{{
Coord = Coord = newnew float[N=n]; float[N=n];
Initialise(A);Initialise(A);
}}
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Vecteur::~Vecteur()Vecteur::~Vecteur()
{{
coutcout << " Destructeur Vecteur" << N <<<< " Destructeur Vecteur" << N << endlendl;;
delete []delete [] Coord ; Coord ;
}}
voidvoid Vecteur::Affiche()Vecteur::Affiche()
{{
intint i; i;
coutcout << "Pointeur Coord << Coord " << << "Pointeur Coord << Coord " << endlendl;;
coutcout << " Vecteur de dimension N = " << N <<<< " Vecteur de dimension N = " << N << endl endl;;
for ( i = 0 ; i < N ; i++ )for ( i = 0 ; i < N ; i++ )
cout cout << Coord[i] << << Coord[i] << endlendl;;
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
void Vecteur::Initialisevoid Vecteur::Initialise((float *float * A A))
{{
intint i; i;
ifif ( A == NULL )( A == NULL )
{{
forfor ( i = 0 ; i < N; i++ ) ( i = 0 ; i < N; i++ )
Coord[i]=0. ;Coord[i]=0. ;
elseelse
{{
forfor ( i = 0 ; i < N; i++ ) ( i = 0 ; i < N; i++ )
Coord[i]= A[i] ;Coord[i]= A[i] ;
}}
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe#include "Vecteur.hxx"#include "Vecteur.hxx"
int main ()int main ()
{{
int code_error = 1 ;int code_error = 1 ;
float A[]={1.,2.,3.,4.};float A[]={1.,2.,3.,4.};
Vecteur V1(3);Vecteur V1(3);
V1.Affiche() ;V1.Affiche() ;
Vecteur V2(4,A);Vecteur V2(4,A);
V2.Affiche() ;V2.Affiche() ;
Vecteur V3 = V2 ;Vecteur V3 = V2 ;
V3.Affiche() ;V3.Affiche() ;
Vecteur V4(0) ;Vecteur V4(0) ;
V4.Affiche() ;V4.Affiche() ;
Vecteur V5 = V4 ;Vecteur V5 = V4 ;
V5.Affiche() ;V5.Affiche() ;
return code_error;return code_error;
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Problématique du constructeur par recopie.Problématique du constructeur par recopie.
void Fonction ( Vecteur ) ;void Fonction ( Vecteur ) ;
Vecteur V1(5) ;Vecteur V1(5) ;
Vecteur V2 = V1; ======> RecopieVecteur V2 = V1; ======> Recopie
Fonction(V1); ======> RecopieFonction(V1); ======> Recopie
Les instructions suivantes impliquent leconstructeur par recopie, défini par défaut:
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Vecteur V1 Vecteur V2Vecteur V1 Vecteur V2
Objet Vecteur
Tableau Dynamique
Objet Vecteur
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Vecteur V1 Vecteur V2Vecteur V1 Vecteur V2
Objet Vecteur
Tableau Dynamique
Objet Vecteur
Tableau Dynamique
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classe
Solution obligatoireSolution obligatoire: :
Redéfinir le constructeur par recopie.Redéfinir le constructeur par recopie.
Son prototype: Vecteur (Son prototype: Vecteur ( const const Vecteur &) Vecteur &)
((à rajouter dans la définition de la classe, sous le statut public)à rajouter dans la définition de la classe, sous le statut public)
VecteurVecteur::::VecteurVecteur((constconst Vecteur & V)Vecteur & V)
{{
Coord =Coord = new new float [N=V.N];float [N=V.N];
Initialise(V.Coord);Initialise(V.Coord);
}}
Définition d ’une classeDéfinition d ’une classeDéfinition d ’une classeDéfinition d ’une classeVecteur::VecteurVecteur::Vecteur((constconst Vecteur & V)Vecteur & V)
{{
coutcout << " Constructeur par recopie Vecteur " << << " Constructeur par recopie Vecteur " << endlendl;;
ifif ( V.N == 0 )( V.N == 0 )
{{
Coord = NULL ;Coord = NULL ;
N= 0 ;N= 0 ;
}}
elseelse
{{
Coord = Coord = newnew float[N=V.N]; float[N=V.N];
Initialise(V.Coord);Initialise(V.Coord);
}}
}}
Chapitre 3Chapitre 3Chapitre 3Chapitre 3
Surdéfinition des opérateurs.Surdéfinition des opérateurs.Surdéfinition des opérateurs.Surdéfinition des opérateurs.
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Tous les opérateurs peuvent être redéfinis sauf . et pour certains des Tous les opérateurs peuvent être redéfinis sauf . et pour certains des contraintes ) mais les règles de priorité et d ’associativité sont conservées.contraintes ) mais les règles de priorité et d ’associativité sont conservées.
Par exemple définissons l ’opérateur + pour la classe Complex.Par exemple définissons l ’opérateur + pour la classe Complex.
Complex Complex operator +operator + ( ( constconst Complex Complex && ) )
( prototype dans la définition de la classe Complex)( prototype dans la définition de la classe Complex)
Complex Complex::Complex Complex::operator +operator + ( ( constconst Complex Complex && Z) Z)
{{
Complex R;Complex R;
R.x=x+Z.x;R.x=x+Z.x;
R.y=y+Z.y;R.y=y+Z.y;
return R;return R;
}}
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
PluralitéPluralité OpérateursOpérateurs AssociativitéAssociativité
BinaireBinaire () [] ->() [] -> Gauche-droiteGauche-droite
UnaireUnaire + - ++ --+ - ++ -- ! ~ * & new new [] ! ~ * & new new [] delete delete [] (cast)delete delete [] (cast)
Droite-gaucheDroite-gauche
BinaireBinaire * / %* / % Gauche-droiteGauche-droite
BinaireBinaire + -+ - Gauche-droiteGauche-droite
BinaireBinaire << >><< >> Gauche-droiteGauche-droite
BinaireBinaire < <= > >=< <= > >= Gauche-droiteGauche-droite
BinaireBinaire == !=== != Gauche-droiteGauche-droite
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
PluralitéPluralité OpérateursOpérateurs AssociativitéAssociativité
BinaireBinaire && Gauche-droiteGauche-droite
BinaireBinaire .. Gauche-droiteGauche-droite
BinaireBinaire || || Gauche-droiteGauche-droite
BinaireBinaire &&&& Gauche-droiteGauche-droite
BinaireBinaire || Gauche-droiteGauche-droite
BinaireBinaire = += -= *= /= %= &= ^= |= += -= *= /= %= &= ^= |= <<= >>== <<= >>=
Droite-GaucheDroite-Gauche
BinaireBinaire ,, Gauche-droiteGauche-droite
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Problématique de l ’opérateur d ’affectation : V2=V1Problématique de l ’opérateur d ’affectation : V2=V1
Vecteur V1 Vecteur V2 Vecteur V1 Vecteur V2
Objet Vecteur
Tableau Dynamique A1
Objet Vecteur
Tableau Dynamique A2
Surdéfinition des OpérateursSurdéfinition des OpérateursSurdéfinition des OpérateursSurdéfinition des Opérateurs
Vecteur V1 = Vecteur V2Vecteur V1 = Vecteur V2
Objet Vecteur
Tableau Dynamique A1
Objet Vecteur
Tableau Dynamique A2
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Problématique de l ’opérateur d ’affectation : V2=V1Problématique de l ’opérateur d ’affectation : V2=V1
Vecteur V1 Vecteur V2 Vecteur V1 Vecteur V2
Objet Vecteur
Tableau Dynamique A1
Objet Vecteur
Tableau Dynamique A1
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSolution obligatoireSolution obligatoire: :
Redéfinir l ’opérateur d ’affectation.Redéfinir l ’opérateur d ’affectation.
Son prototype: Vecteur & operator = ( const Vecteur &) Son prototype: Vecteur & operator = ( const Vecteur &)
((à rajouter dans la définition de la classe, sous le statut public)à rajouter dans la définition de la classe, sous le statut public)
Vecteur & Vecteur::operator =Vecteur & Vecteur::operator = ( (const const Vecteur & V)Vecteur & V)
{{
if (if ( this this != &V)!= &V)
{ {
delete []delete [] Coord ;Coord ;
Coord =Coord = newnew float [N=V.N];float [N=V.N];
Initialise(V.Coord);Initialise(V.Coord);
}}
return *this ;return *this ;
}}
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Une classe contenant des objets ou des tableaux dynamiques doitUne classe contenant des objets ou des tableaux dynamiques doit impérativementimpérativement contenir:contenir:
Au moins un constructeur.Au moins un constructeur. Un destructeur.Un destructeur. Un constructeur par recopie.Un constructeur par recopie. Surdéfinition de l ’opérateur d ’affectation.Surdéfinition de l ’opérateur d ’affectation.
Cet ensemble constitue laCet ensemble constitue la base canoniquebase canonique de la classede la classe,,
indispensableindispensable pour le bon fonctionnement de la gestion de la mémoire.pour le bon fonctionnement de la gestion de la mémoire.
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Vecteur V1 Vecteur V2Vecteur V1 Vecteur V2
Objet Vecteur
Tableau Dynamique
Objet Vecteur
Afin d’éviter de dupliquer la zone mémoire, ce problème peut être traiter
avec un compteur de référence sur cette zone.
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Surdéfinition de l ’opérateur []:Surdéfinition de l ’opérateur []:
On aimerait accéder ou modifier les composantes du vecteur V,On aimerait accéder ou modifier les composantes du vecteur V, soient les valeurs de type float: V.Coord[i], avec une écriture plus directe c ’est à soient les valeurs de type float: V.Coord[i], avec une écriture plus directe c ’est à
dire V[i].dire V[i].Pour cela il faut surdéfinir l ’ opérateur []Pour cela il faut surdéfinir l ’ opérateur []
Prototype à déclarer dans classe vecteur:Prototype à déclarer dans classe vecteur: float & operator [] ( int )float & operator [] ( int )
float &float & Vecteur::Vecteur::operator []operator [] ( ( intint ii)){{ return Coord[i] ;return Coord[i] ;}}
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Surdéfinition de l ’opérateur « Cast »:Surdéfinition de l ’opérateur « Cast »:Conversions implicites (mises en place par le compilateur) ou explicites (appel de l ’opérateur Conversions implicites (mises en place par le compilateur) ou explicites (appel de l ’opérateur
cast)cast)Exemple:Exemple:int int i,j;i,j;doubledouble x x=3.14159;=3.14159;i=x; // Conversion implicitei=x; // Conversion implicitej=j=int (int ( xx) ) ; ; //Conversion explicite//Conversion explicite
Les conversions définies par l ’utilisateur:Les conversions définies par l ’utilisateur:Reprenons les classes Point et Complex et on aimerait pouvoir convertir un complex en un Reprenons les classes Point et Complex et on aimerait pouvoir convertir un complex en un
point et réciproquement.point et réciproquement.Complex z1(1.,2.);Complex z1(1.,2.);Point P1(1.,2.);Point P1(1.,2.);Point P2=z1;Point P2=z1;Complex z2=P1;Complex z2=P1;
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Première solution avec les contructeurs:Première solution avec les contructeurs:
On peut définir un constructeur de la classe Point avec un Complex comme argumentOn peut définir un constructeur de la classe Point avec un Complex comme argument Point(const Complex &)Point(const Complex &)
On peut définir un constructeur de la classe Complex avec un Point comme argumentOn peut définir un constructeur de la classe Complex avec un Point comme argument Complex(const Point &)Complex(const Point &)
Deuxième solution surdéfinir l ’opérateur Cast:Deuxième solution surdéfinir l ’opérateur Cast:
point ->Complex point ->Complex PrototypePrototype operatoroperator Complex()Complex() Complex ->Point Complex ->Point PrototypePrototype operator operator Point()Point()
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
class Point { class Complex {class Point { class Complex {float x ; float x ; float x ; float x ; float y ; float y ;float y ; float y ;……. ….. ….Complex() ; Point() ;Complex() ; Point() ;……. ….. ….}; };}; };Point::Complex() Complex::Point()Point::Complex() Complex::Point(){ {{ { return Complex (x,y); return Point(x,y);return Complex (x,y); return Point(x,y);} }} }
Surdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateursSurdéfinition des opérateurs
Quelques règles essentielles:Quelques règles essentielles:
On ne peut surdéfinir un opérateur que s ’il comporte au moins un argument On ne peut surdéfinir un opérateur que s ’il comporte au moins un argument ( implicite ou non) de type classe.( implicite ou non) de type classe.
Le mot clé explicit devant le constructeur interdit son utilisation dans des Le mot clé explicit devant le constructeur interdit son utilisation dans des conversions implicites.conversions implicites.
Les possibilités de conversion en chaîne sont limitées au nombre de 3.Les possibilités de conversion en chaîne sont limitées au nombre de 3. ( standard, C.D.U., standard)( standard, C.D.U., standard)
Membre Objet d’une classeMembre Objet d’une classeMembre Objet d’une classeMembre Objet d’une classe
Considerons la classe Cercle suivante:Considerons la classe Cercle suivante:
Class Cercle {Class Cercle {Point Centre ;Point Centre ;float Rayon;float Rayon;public:public:Cercle ( float , float , float );Cercle ( float , float , float );Cercle ( const Point & );Cercle ( const Point & );Cercle (const Cercle &) ;Cercle (const Cercle &) ;};};
Membre Objet d’une classeMembre Objet d’une classeMembre Objet d’une classeMembre Objet d’une classe
Cercle::Cercle(float a , float b, float r):Centre(a,b),Rayon®Cercle::Cercle(float a , float b, float r):Centre(a,b),Rayon®{{}}Cercle::Cercle(const Point & P, float r):Centre(P),Rayon(r)Cercle::Cercle(const Point & P, float r):Centre(P),Rayon(r){{}}Cercle::Cercle(const Cercle & C):Centre(C),Rayon(C.Rayon)Cercle::Cercle(const Cercle & C):Centre(C),Rayon(C.Rayon){{}}
Chapitre 4Chapitre 4Chapitre 4Chapitre 4
Les fonctions et classes amiesLes fonctions et classes amiesLes fonctions et classes amiesLes fonctions et classes amies
Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.
Introduction:Introduction:Reprenons la classe Complex avec la surdéfinition de l ’opérateur +Reprenons la classe Complex avec la surdéfinition de l ’opérateur +comme fonction membre de la classe.comme fonction membre de la classe.
On a vu que l ’on peut définir l ’opération suivante:On a vu que l ’on peut définir l ’opération suivante:Complex z1(1.,2);Complex z1(1.,2);float x=3.;float x=3.;Complex z2=z1+ 3. ; // 3 est converti en Complex implicitement.Complex z2=z1+ 3. ; // 3 est converti en Complex implicitement.
Par contre, on ne peut pas définir l ’opération:Par contre, on ne peut pas définir l ’opération:Complex z2 = 3 + z1;Complex z2 = 3 + z1;
Pour pallier à ce problème, on va définir l ’opérateur +, comme fonctionPour pallier à ce problème, on va définir l ’opérateur +, comme fonctionindépendante et la déclarer fonction amie de la classe Complex.indépendante et la déclarer fonction amie de la classe Complex.
Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.
class class Complex {Complex { private:private: … … public:public: … … friendfriend Complex Complex opérator +opérator + ( const Complex & , const Complex & ) ; ( const Complex & , const Complex & ) ;};};Complex Complex opérator +opérator + ( const Complex & z1,const Complex & z2) ( const Complex & z1,const Complex & z2){{ Complex z;Complex z; z.x=z1.x+z2.x;z.x=z1.x+z2.x; z.y=z1.y+z2.y;z.y=z1.y+z2.y; return z;return z;}}
Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.
Une fonction indépendante peut être déclarée amie d ’une classe.Une fonction indépendante peut être déclarée amie d ’une classe. ( a accès à tous les membres privés de cette classe.)( a accès à tous les membres privés de cette classe.)
Une fonction membre d ’une autre classe A peut être déclarée amie d’une classe BUne fonction membre d ’une autre classe A peut être déclarée amie d’une classe B ( Cette fonction a accès à tous les membres privés de cette classe B.)( Cette fonction a accès à tous les membres privés de cette classe B.)
Une classe A toute entière peut être déclarée amie d’une classe B.Une classe A toute entière peut être déclarée amie d’une classe B. ( Toutes les fonctions membres de cette classe A amie ont accès à tous( Toutes les fonctions membres de cette classe A amie ont accès à tous les membres privés de cette classe B.)les membres privés de cette classe B.)
La notion d ’amitié casse lLa notion d ’amitié casse l ’encapsulation des membres privés’encapsulation des membres privés..
Les fonctions et les classses amies.Les fonctions et les classses amies.Les fonctions et les classses amies.Les fonctions et les classses amies.#include <Vecteur.hxx>#include <Vecteur.hxx>class class Matrice {Matrice {……Public:Public:FriendFriend Vecteur Vecteur operator *operator * ( ( constconst Matrice &, Matrice &, constconst Vecteur &); Vecteur &);};};
Vecteur Vecteur operator *operator * ( (constconst Matrice & M , Matrice & M , constconst Vecteur & V) Vecteur & V){ { int i,j;int i,j; Vecteur R(M.N) ;Vecteur R(M.N) ; for ( i=0;i<M.N;i++) { for ( i=0;i<M.N;i++) { R[i] = 0.R[i] = 0. for ( j=0;j<M.N;j++) {for ( j=0;j<M.N;j++) { R[i] += M.Lines[i][j] * V[j];R[i] += M.Lines[i][j] * V[j]; }} return R;return R; }}
Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.
Fonction membre d ’une autre classe, déclarée amie d ’une classe.Fonction membre d ’une autre classe, déclarée amie d ’une classe.Exemple:Exemple:On veut définir l ’opérateur * multiplication d ’une matrice par un vecteur,On veut définir l ’opérateur * multiplication d ’une matrice par un vecteur,cet opérateur sera déclaré fonction membre de la classe matrice:cet opérateur sera déclaré fonction membre de la classe matrice:Vecteur Vecteur operator *operator * ( ( const const Vecteur Vecteur &&););
Dans la classe Vecteur, cet opérateur sera déclaré fonction amie:Dans la classe Vecteur, cet opérateur sera déclaré fonction amie:friend Vecteur Matricefriend Vecteur Matrice::operator *::operator * ( ( constconst Vecteur Vecteur &)&);;
Dans la définition de la classe Matrice, il suffira de signaler au compilateur que la classe Vecteur Dans la définition de la classe Matrice, il suffira de signaler au compilateur que la classe Vecteur si elle n ’est pas déjà définie, sera définie ultérieurement par la déclaration suivante:si elle n ’est pas déjà définie, sera définie ultérieurement par la déclaration suivante:
class Vecteur;class Vecteur;
Par contre, dans la définition de la classe Vecteur, Par contre, dans la définition de la classe Vecteur, il est obligatoire d ’avoiril est obligatoire d ’avoirdéjà défini la classe Matrice par la déclaration suivante:déjà défini la classe Matrice par la déclaration suivante:#include #include <Matrice.hxx><Matrice.hxx>
Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.Les fonctions et les classes amies.
Classe entière déclarée classe amie d ’une autre classeClasse entière déclarée classe amie d ’une autre classe ..
On a le choix, on peut simplement signaler dans l ’une ou les On a le choix, on peut simplement signaler dans l ’une ou les deux classesdeux classes
que la classe complémentaire sera définie ultérieurement.que la classe complémentaire sera définie ultérieurement.
Cette possibilité est à éviter, on doit encapsuler les données au Cette possibilité est à éviter, on doit encapsuler les données au maximum par principe, pour éviter toute possibilité maximum par principe, pour éviter toute possibilité d ’erreur.d ’erreur.
Chapitre 5Chapitre 5Chapitre 5Chapitre 5
HéritageHéritageHéritageHéritage
Héritage.Héritage.Héritage.Héritage.
Concept d ’héritage (un outil puissant) :Concept d ’héritage (un outil puissant) :Il autorise à définir une nouvelle classe dite Il autorise à définir une nouvelle classe dite dérivée dérivée à partir d ’une classe existante, à partir d ’une classe existante,
dite de dite de basebase. La classe dérivée héritera des possibilités de la classe de base en lui . La classe dérivée héritera des possibilités de la classe de base en lui ajoutant de nouvelles. ajoutant de nouvelles.
Exemple:Exemple:Reprenons la classe Point et à partir de cette classe, définissons une nouvelle classe PointColorie Reprenons la classe Point et à partir de cette classe, définissons une nouvelle classe PointColorie
qui héritera de la classe Point.qui héritera de la classe Point.La classe de base Point possède comme attributs l ’abscisse et l ’ordonnée d ’un point; la classe La classe de base Point possède comme attributs l ’abscisse et l ’ordonnée d ’un point; la classe
ajoute l ’attribut d ’une couleur.ajoute l ’attribut d ’une couleur.classclass PointColorie : PointColorie : publicpublic Point Point {{intint Color; Color;public:public:PointColorie ( float = 0 , float = 0 , int = 1 ) ;PointColorie ( float = 0 , float = 0 , int = 1 ) ;Initialise ( float = 0 , float = 0 , int = 1 ) ;Initialise ( float = 0 , float = 0 , int = 1 ) ;void Affiche() ;void Affiche() ;};};
Héritage.Héritage.Héritage.Héritage.
#include <Point.hxx>#include <Point.hxx>PointColorie::PointColorie( float a , float b ,int c):Point(a,b),Color(c){}PointColorie::PointColorie( float a , float b ,int c):Point(a,b),Color(c){}
void PointColorie::Initialise ( float a , float b ,int c) {void PointColorie::Initialise ( float a , float b ,int c) {Point::Initialise(a,b);Point::Initialise(a,b);Color = c ;Color = c ;}}
void PointColorie::Affiche() {void PointColorie::Affiche() {Point::Affiche() ;Point::Affiche() ;cout << C << endl;cout << C << endl;}}L ’opérateur L ’opérateur Point::Point:: est indispensable ici car Point et PointColorie possèdent les méthodes est indispensable ici car Point et PointColorie possèdent les méthodes
Affiche et Initialise.Affiche et Initialise.
Héritage.Héritage.Héritage.Héritage.
Le statut protectedLe statut protected
La classe dérivée n ’a pas accès aux membres privés de la classe de base.La classe dérivée n ’a pas accès aux membres privés de la classe de base.
Il existe un troisième statut Il existe un troisième statut protectedprotected, les membres protégés d ’une classe de base , les membres protégés d ’une classe de base sont accessibles à toute classe dérivée. sont accessibles à toute classe dérivée.
Une fonction amie d ’une classe dérivée aura accès aux membres protégés de la classe Une fonction amie d ’une classe dérivée aura accès aux membres protégés de la classe de base.de base.
Par contre, l ’amitié ne s ’hérite pas, une fonction déclarée amie dans une classe de Par contre, l ’amitié ne s ’hérite pas, une fonction déclarée amie dans une classe de base n ’est pas fonction amie d ’une classe dérivée.base n ’est pas fonction amie d ’une classe dérivée.
Héritage.Héritage.Héritage.Héritage.
Les différents modes de dérivationLes différents modes de dérivationDérivation PubliqueDérivation Publique Classe de baseClasse de base Classe dérivéeClasse dérivée ExtérieurExtérieur Nouveau StatutNouveau Statut Membres PrivésMembres Privés non accessiblesnon accessibles non accessiblesnon accessibles PrivéPrivé Membres Protégés Membres Protégés accessibles accessibles non accessiblesnon accessibles ProtectedProtected Membres publiques Membres publiques accessiblesaccessibles accessiblesaccessibles publicpublic
Dérivation PrivéeDérivation Privée Classe de baseClasse de base Classe dérivéeClasse dérivée ExtérieurExtérieur Nouveau StatutNouveau Statut Membres PrivésMembres Privés non accessiblesnon accessibles non accessiblesnon accessibles privéprivé Membres ProtégésMembres Protégés accessiblesaccessibles non accessiblesnon accessibles privéprivé Membres publiquesMembres publiques accessiblesaccessibles non accessiblesnon accessibles privéprivé
Dérivation protégéeDérivation protégée Classe de baseClasse de base Classe dérivéeClasse dérivée ExtérieurExtérieur Nouveau StatutNouveau Statut Membres PrivésMembres Privés non accessiblesnon accessibles non accessiblesnon accessibles privéprivé Membres ProtégésMembres Protégés accessiblesaccessibles non accessiblesnon accessibles protectedprotected Membres publiquesMembres publiques accessiblesaccessibles non accessiblesnon accessibles protectedprotected
Héritage.Héritage.Héritage.Héritage.
Constructeur par recopie et opérateur d ’affectation dans la classe dérivéeConstructeur par recopie et opérateur d ’affectation dans la classe dérivée ..
On suppose que le constructeur par recopie et l ’opérateur d ’affection ont été définis dans la On suppose que le constructeur par recopie et l ’opérateur d ’affection ont été définis dans la classe de base.classe de base.
Si on utilise le constructeur par recopie ou l ’opérateur d ’affection par défaut dans la classe Si on utilise le constructeur par recopie ou l ’opérateur d ’affection par défaut dans la classe dérivée -> Pas de problème.dérivée -> Pas de problème.
Si le constructeur par recopie ou l ’opérateur d ’affection ont été redéfinis dans la classe Si le constructeur par recopie ou l ’opérateur d ’affection ont été redéfinis dans la classe
dérivée -> dérivée -> AttentionAttention il faudra appeler il faudra appeler explicitementexplicitement le constructeur par recopie ou le constructeur par recopie ou l ’opérateur d ’affection de la l ’opérateur d ’affection de la classe de baseclasse de base..
Héritage.Héritage.Héritage.Héritage.
PointColorie::PointColorie(const PointColorie & P):Point(P)PointColorie::PointColorie(const PointColorie & P):Point(P) {{ Couleur=P.Couleur;Couleur=P.Couleur; }}
PointColorie & PointColorie::operator = (const PointColorie & P)PointColorie & PointColorie::operator = (const PointColorie & P){{ if ( this != &P)if ( this != &P) {{ Point::operator = (P) ;Point::operator = (P) ; Couleur = P.Couleur ;Couleur = P.Couleur ;
}} return *thisreturn *this}}
Héritage.Héritage.Héritage.Héritage.
Héritage MultipleHéritage MultipleUne classe peut hériter de plusieurs classes.Une classe peut hériter de plusieurs classes.Exemple:Exemple:On s ’est défini la classe Point et la classe Couleur et on veut définir la classe PointColorie qui On s ’est défini la classe Point et la classe Couleur et on veut définir la classe PointColorie qui
hérite de Point et de Couleur.hérite de Point et de Couleur.
classclass PointColorie: PointColorie: public public Point , Point , publicpublic Couleur { Couleur {public:public:PointColorie(PointColorie( float float a , a , floatfloat b , b , intint coul):Point(a,b),Couleur(coul){} coul):Point(a,b),Couleur(coul){}void void Affiche(){Point::Affiche();Couleur::Affiche();}Affiche(){Point::Affiche();Couleur::Affiche();}};};
Attention l ’heritage multiple présente des inconvénients!Attention l ’heritage multiple présente des inconvénients!
Héritage.Héritage.Héritage.Héritage.
Héritage MultipleHéritage MultipleExemple compliqué:Exemple compliqué:
Point
PointColorie Cercle
CercleColorie
Héritage.Héritage.Héritage.Héritage.
Héritage MultipleHéritage MultipleExemple compliqué:Exemple compliqué:
Point
PointColorieCercle
CercleColorie
Couleur
Héritage.Héritage.Héritage.Héritage.
Conversion entre classe de base et classe dérivée.Conversion entre classe de base et classe dérivée. La conversion implicite ( Cast )classe dérivée en classe de base ne pose aucun problème.La conversion implicite ( Cast )classe dérivée en classe de base ne pose aucun problème. Exemple: Exemple: Point = PointColoriePoint = PointColorieLa conversion inverse ( downcast ) n ’est pas immédiate, on peut surdéfinir un constructeur deLa conversion inverse ( downcast ) n ’est pas immédiate, on peut surdéfinir un constructeur dela classe dérivée à partir de le classe de base en donnant une valeur par défaut, aux attributs la classe dérivée à partir de le classe de base en donnant une valeur par défaut, aux attributs complémentaires.complémentaires. Exemple : PointColorie (Exemple : PointColorie (const const Point & ,Point & , intint = 1)= 1)PointColorie = PointPointColorie = PointProblématique des conversions de pointeurs:Problématique des conversions de pointeurs:
Point * = PointColorie *Point * = PointColorie *PointColorie * = ( PointColorie *) Point *PointColorie * = ( PointColorie *) Point *
Utilisation du mot cle:Utilisation du mot cle: virtual virtual
Chapitre 6Chapitre 6Chapitre 6Chapitre 6
PolymorphismePolymorphismePolymorphismePolymorphisme
Polymorphisme.Polymorphisme.Polymorphisme.Polymorphisme.
Classe abstraite : classe RootClasse abstraite : classe Root#ifndef SHAPE#ifndef SHAPE#define SHAPE#define SHAPEclass Shape{class Shape{public:public:virtualvirtual float Perimetre () float Perimetre () constconst { return 0. ; } { return 0. ; } virtualvirtual float Aire () float Aire () const const { return 0. ; }{ return 0. ; }virtualvirtual float Volume () float Volume () const const { return 0. ; }{ return 0. ; }virtualvirtual void PrintName() void PrintName() const = 0 const = 0 ;;virtualvirtual void Print() void Print() const = 0 const = 0 ;;};};#endif#endif
Polymorphisme.Polymorphisme.Polymorphisme.Polymorphisme.
#include <iostream.h>#include <iostream.h>#include <Cylindre.hxx>#include <Cylindre.hxx>main()main(){{ Point P(1.2.);Point P(1.2.); Cercle C(3.,4.,1.,);Cercle C(3.,4.,1.,); Cylindre Cyl(5.,6.,2.,3.);Cylindre Cyl(5.,6.,2.,3.); Shape ** ItemTab;Shape ** ItemTab; ItemTab = new Shape * [3];ItemTab = new Shape * [3]; Shape * AnyItem;Shape * AnyItem; ItemTab[0] = &P;ItemTab[0] = &P; ItemTab[1] = &C;ItemTab[1] = &C; ItemTab[2] = &Cyl;ItemTab[2] = &Cyl;
Polymorphisme.Polymorphisme.Polymorphisme.Polymorphisme.
For ( int i = 0 ; i < 3 : i++ )For ( int i = 0 ; i < 3 : i++ ) {{ AnyItem = ItemTab[i] ;AnyItem = ItemTab[i] ; AnyItem->Print() ; AnyItem->Print() ; AnyItem->PrintName() ; AnyItem->PrintName() ; cout << AnyItem->Perimetre();cout << AnyItem->Perimetre(); cout << AnyItem->Aire();cout << AnyItem->Aire(); cout << AnyItem->Volume();cout << AnyItem->Volume(); }} delete [] ItemTab ;delete [] ItemTab ;}}
Chapitre 7Chapitre 7Chapitre 7Chapitre 7
Patrons de fonctions et de classesPatrons de fonctions et de classesPatrons de fonctions et de classesPatrons de fonctions et de classes
Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.
Patrons de fonctions:Patrons de fonctions:
#include <iostream.h>#include <iostream.h>template <class T>template <class T> T maximum (T x , T y) { return x<y?y:x;} T maximum (T x , T y) { return x<y?y:x;}main ()main (){{ intint i = 1 ; i = 1 ; intint j = 2 ; j = 2 ; floatfloat x = 3.; x = 3.; floatfloat y = 4.; y = 4.; cout cout << maximum(i,j) << endl;<< maximum(i,j) << endl; coutcout << maximum(x,y) <<endl; << maximum(x,y) <<endl;}}Forme généraleForme généraletemplate <classtemplate <class T , T , class class U ,U , classclass V> T myFonction( T x, U y,V z) { …} V> T myFonction( T x, U y,V z) { …}
Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.
Patrons de classes:Patrons de classes:
#ifndef POINT#ifndef POINT#define POINT#define POINTtemplate template <<classclass T> T> classclass Point { Point {private:private:T x ;T x ;T y;T y;public:public:Point ( T = 0 , T = 0 ) ;Point ( T = 0 , T = 0 ) ;void Affiche () ;void Affiche () ;};};#endif#endif
Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.Patrons de Fonctions et de Classes.
#include <isotream.h>#include <isotream.h>#include <Point.hxx>#include <Point.hxx>template <class T> Point<T>::template <class T> Point<T>::Point( T a , T b):x(a),y(b){}Point( T a , T b):x(a),y(b){}template <class T>template <class T> void void Point<T>::Point<T>::Affiche()Affiche() {{cout << x << endl ;cout << x << endl ;cout << y << endl; }cout << y << endl; }
#include <Point.hxx>#include <Point.hxx>main() main() {{ Point <int> P(1,2);Point <int> P(1,2); Point <float> XP(3.,4.);Point <float> XP(3.,4.); P.Affiche();P.Affiche(); XP.Affiche();XP.Affiche();}}
Chapitre 8Chapitre 8Chapitre 8Chapitre 8
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Standard template LibraryStandard template LibraryStandard template LibraryStandard template Library
Cette librairie fournit des patrons de fonctions et de classes permettant deCette librairie fournit des patrons de fonctions et de classes permettant de définir des collections (conteneurs) d ’objets et des utilitaires (itérateurs et définir des collections (conteneurs) d ’objets et des utilitaires (itérateurs et
algorithmes) pour manipuler ces collections d ’objets. algorithmes) pour manipuler ces collections d ’objets.
Les conteneurs séquentiels:Les conteneurs séquentiels:
vectorvector: tableau défini sur un seul bloc. (accès direct): tableau défini sur un seul bloc. (accès direct) dequedeque: tableau défini sur plusieurs blocs. (accès direct): tableau défini sur plusieurs blocs. (accès direct) listlist: liste doublement chaînée.: liste doublement chaînée.
Les conteneurs associatifs:Les conteneurs associatifs:
mapmap clé associée à une valeur.( cas particulier: clé associée à une valeur.( cas particulier: setset)) multimapmultimap clé associée à plusieurs valeurs. ( cas particulier: clé associée à plusieurs valeurs. ( cas particulier: multisetmultiset))
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
A chaque conteneur, on associe un itérateur, par exemple:A chaque conteneur, on associe un itérateur, par exemple:vector<int> v(10);vector<int> v(10);vector<intvector<int>::iterator>::iterator iv; iv;int i=0;int i=0;for (iv=v.for (iv=v.begin();begin();iv!=v.iv!=v.end();end();iv++) (*iv)=++i;iv++) (*iv)=++i;
float x[]={1.,2.,3.,4.};float x[]={1.,2.,3.,4.};list<float> l(x,x+4);list<float> l(x,x+4);list<floatlist<float>::iterator>::iterator il; il;for (il=l.for (il=l.begin();begin();il!=l.il!=l.end();end();il++) cout << (*il) << endl;il++) cout << (*il) << endl;
Les conteneurs vector et deque sont d ’accès direct, l ’opérateur [] est surdéfini, donc on Les conteneurs vector et deque sont d ’accès direct, l ’opérateur [] est surdéfini, donc on peut écrire directement:peut écrire directement:
vector<int> v(10);vector<int> v(10);for (int i = 0 ; i < 10 ; i++) v[i] = i ;for (int i = 0 ; i < 10 ; i++) v[i] = i ;
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Notion d ’algorithmes:Notion d ’algorithmes:A tous ces conteneurs sont associés des patrons de fonctions qui effectuent des A tous ces conteneurs sont associés des patrons de fonctions qui effectuent des
opérations.opérations.Par exemple la fonction sort (algorithme de tri)Par exemple la fonction sort (algorithme de tri)
intint t[]= {5,2,1,3,4}; t[]= {5,2,1,3,4};list list <int> l(t,t+5);<int> l(t,t+5);l.l.sort();sort();résultat:1,2,3,4,5résultat:1,2,3,4,5
Certains algorithmes sont applicables, d ’autres non, par exemple, l ’algorithme de tri Certains algorithmes sont applicables, d ’autres non, par exemple, l ’algorithme de tri est applicable si une relation d ’ordre a été définie sur les éléments du conteneur est applicable si une relation d ’ordre a été définie sur les éléments du conteneur list.list.
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Générateurs d ’opérateurs.Générateurs d ’opérateurs.La bibliothèque peut générer:La bibliothèque peut générer: l ’opérateur l ’opérateur !=!= à partir de l ’opérateur à partir de l ’opérateur ==== les opérateurs les opérateurs >>, , >=>=, , <= <= à partir de l ’opérateur à partir de l ’opérateur <<;;Par conséquent, dans une classe, il suffit de la munir des deux seuls opérateurs Par conséquent, dans une classe, il suffit de la munir des deux seuls opérateurs ==== et et <<..
Constructeurs et affectation.Constructeurs et affectation.Tous les conteneurs possèdent un constructeur par recopie et un opérateur Tous les conteneurs possèdent un constructeur par recopie et un opérateur
d ’affectation.d ’affectation.list<int>list<int> l(5) ; l(5) ;int t[5]={1,2,3,4,5};int t[5]={1,2,3,4,5};list<int>list<int> l(t,t+5); l(t,t+5);vector<int>vector<int> v(l. v(l.begin()begin(),l.,l.end()end()));;vector <int>vector <int> v(l. v(l.rbegin()rbegin(),l.,l.rendrend());());
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Fonctionnalités communes aux conteneurs séquentiels (vector,deque,list)Fonctionnalités communes aux conteneurs séquentiels (vector,deque,list) assign()assign() vector<int> v(…);vector<int> v(…);list<int> l.assign(v.begin(),v.end()); list<int> l.assign(v.begin(),v.end());
clear()clear() vide le conteneur vide le conteneur swap()swap() échange le contenu de 2 conteneurs de même type. échange le contenu de 2 conteneurs de même type. insertinsert(position,valeur),(position,valeur),insertinsert(position,NbFois,valeur),(position,NbFois,valeur),insertinsert(debut,fin,valeur).(debut,fin,valeur). eraseerase(position),(position),eraseerase(debut,fin)(debut,fin) push_backpush_back() et () et pop_backpop_back() insertion et suppression sur le dernier élément.() insertion et suppression sur le dernier élément. push_frontpush_front() et () et pop_frontpop_front() uniquement pour les conteneurs deque et list.() uniquement pour les conteneurs deque et list.
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Fonctionnalités propre au conteneur list.Fonctionnalités propre au conteneur list.
removeremove(valeur) supprime les éléments égaux à valeur.(valeur) supprime les éléments égaux à valeur. remove_ifremove_if(predicat) (predicat) sortsort() et () et sortsort(predicat)(predicat) uniqueunique() supprime les doublons.() supprime les doublons. mergemerge(liste) et (liste) et mergemerge(liste,predicat)(liste,predicat) splicesplice(position,liste)(position,liste)
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Les adaptateurs de conteneur:queue,stack,priority_queueLes adaptateurs de conteneur:queue,stack,priority_queue stackstack destiné à la gestion de piles de type (last in, first out)destiné à la gestion de piles de type (last in, first out) stackstack<int,vector<int> > s1;<int,vector<int> > s1; stackstack<int,deque<int> > s2; <int,deque<int> > s2; stackstack<int,list<int> > s3;<int,list<int> > s3; Interface: Interface: empty(),size(),top(),push(valeur),pop()empty(),size(),top(),push(valeur),pop()
queue destiné à la gestion des piles de type (first in, first out)queue destiné à la gestion des piles de type (first in, first out) queuequeue<int,deque<int> q1;<int,deque<int> q1; queuequeue<int,list<int> q2;<int,list<int> q2; Interface: Interface: empty(),size(),front(),back(),push(valeur),pop()empty(),size(),front(),back(),push(valeur),pop()
priority_queue introduction d ’un élément en fin suivant un prédicat.priority_queue introduction d ’un élément en fin suivant un prédicat. priority_queuepriority_queue<int,deque<int> , greater<int> >q1;<int,deque<int> , greater<int> >q1;
Interface: Interface: empty(),size(),top(),push(valeur),pop()empty(),size(),top(),push(valeur),pop()
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
#include <iostream>#include <iostream>#include <vector>#include <vector>« include <list>« include <list>using namespace std;using namespace std;int main()int main(){{ intint t1[]={3,5,4,7,1,9,2,8,6}; t1[]={3,5,4,7,1,9,2,8,6}; vector <int>vector <int> v(t1,t1+6); v(t1,t1+6); for (int i =0 ; i<v.for (int i =0 ; i<v.size();size(); i++) cout << v[i] ; i++) cout << v[i] ; cout << endl;cout << endl; list <int>list <int> l1(t1,t1+9); l1(t1,t1+9); l1.l1.sort();sort(); list<int>::iteratorlist<int>::iterator il1; il1; for ( il1=l1.for ( il1=l1.begin();begin();il1!=l1.il1!=l1.end();end();il1++) cout << (*il1) ;il1++) cout << (*il1) ; cout << endl;cout << endl;
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
int int t2[]={10,11,12};t2[]={10,11,12}; list <int>list <int> l2(t2,t2+3); l2(t2,t2+3); l1.mergel1.merge(l2);(l2); l1.push_backl1.push_back(13);(13); l1.push_frontl1.push_front(0);(0); for (il1=l1.begin();il1!=l1.end();il1++) cout << (*il) ;for (il1=l1.begin();il1!=l1.end();il1++) cout << (*il) ; cout << endl;cout << endl;}}
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
Les conteneurs associatifsLes conteneurs associatifs
Le conteneur mapLe conteneur map associe une clé et une valeur:associe une clé et une valeur: map<char,int> m;map<char,int> m; m[‘a‘] = 1; // associe la valeur 1 à la clé am[‘a‘] = 1; // associe la valeur 1 à la clé a m[‘b‘] = 2; // associe la valeur 2 à la clé bm[‘b‘] = 2; // associe la valeur 2 à la clé b
Le conteneur multimapLe conteneur multimap associe à une clé plusieurs valeurs.associe à une clé plusieurs valeurs. multimap<char,int> mm;multimap<char,int> mm; mm.insert(make_pair(‘a‘,1));mm.insert(make_pair(‘a‘,1)); mm.insert(make_pair(‘a‘,2));mm.insert(make_pair(‘a‘,2));Les conteneurs set et multiset sont des conteneurs particuliers de map et multimap. Les conteneurs set et multiset sont des conteneurs particuliers de map et multimap.
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
#include <iostream>#include <iostream>#include <map>#include <map>using namespace std;using namespace std;main()main(){{ map <char,float>map <char,float> m; m; m[‘ a ‘] = 3.;m[‘ a ‘] = 3.; m[‘ b ‘] = 2.;m[‘ b ‘] = 2.; m[‘ a ‘] = 1.;m[‘ a ‘] = 1.; map<char,float>::iteratormap<char,float>::iterator im; im; for ( im=m.begin();im!=m.end();im++)for ( im=m.begin();im!=m.end();im++) { { cout << (*im).first << (*im).second << endl ; cout << (*im).first << (*im).second << endl ; } }
Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library
multimap <char,int>multimap <char,int> mm ; mm ; mm.mm.insertinsert((make_pairmake_pair(‘a‘,1));(‘a‘,1)); mm.mm.insertinsert((make_pairmake_pair(‘b‘,10));(‘b‘,10)); mm.mm.insertinsert((make_pairmake_pair(‘c‘,100));(‘c‘,100)); multimap mm<char,int>::iteratormultimap mm<char,int>::iterator imm; imm; for (imm=mm.for (imm=mm.beginbegin();imm!=mm.();imm!=mm.endend();imm++) {();imm++) { cout << (*imm).cout << (*imm).firstfirst << (*imm).<< (*imm).secondsecond << endl; }<< endl; } mmmm.insert.insert((make_pairmake_pair(‘a‘,2));(‘a‘,2));mm.mm.insertinsert((make_pairmake_pair(‘b‘,20));(‘b‘,20));mm.mm.insertinsert((make_pairmake_pair(‘c‘,200));(‘c‘,200));for (imm=mm.for (imm=mm.beginbegin();imm!=mm.();imm!=mm.endend();imm++) {();imm++) { cout << (*imm).cout << (*imm).first first << (*imm).<< (*imm).secondsecond << endl; }<< endl; }} // fin de main } // fin de main