91
Historique Historique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup Langage 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 Delannoy Livre de cours : Programmer en C++ ,Claude Delannoy Eyrolles Eyrolles

HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Embed Size (px)

Citation preview

Page 1: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 2: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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++

Page 3: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 4: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ;

Page 5: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ){{ … …

Page 6: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 7: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 8: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 9: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 & )

Page 10: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.}}

Page 11: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 12: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 13: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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[]

Page 14: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 15: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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)

Page 16: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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();

};};

Page 17: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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)

Page 18: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 19: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

}}

Page 20: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

} }

Page 21: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 22: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 23: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

}}

Page 24: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

} }

Page 25: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 [].

Page 26: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 27: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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);

}}

}}

Page 28: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;;

}}

Page 29: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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] ;

}}

}}

Page 30: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

}}

Page 31: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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:

Page 32: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 33: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 34: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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);

}}

Page 35: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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);

}}

}}

Page 36: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 37: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

}}

Page 38: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 39: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 40: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 41: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 42: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 43: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ;

}}

Page 44: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 45: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 46: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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] ;}}

Page 47: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

Page 48: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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()

Page 49: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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);} }} }

Page 50: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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)

Page 51: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 &) ;};};

Page 52: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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){{}}

Page 53: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Chapitre 4Chapitre 4Chapitre 4Chapitre 4

Les fonctions et classes amiesLes fonctions et classes amiesLes fonctions et classes amiesLes fonctions et classes amies

Page 54: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 55: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;}}

Page 56: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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..

Page 57: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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; }}

Page 58: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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>

Page 59: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 60: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Chapitre 5Chapitre 5Chapitre 5Chapitre 5

HéritageHéritageHéritageHéritage

Page 61: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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() ;};};

Page 62: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 63: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 64: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 65: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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..

Page 66: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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}}

Page 67: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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!

Page 68: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Héritage.Héritage.Héritage.Héritage.

Héritage MultipleHéritage MultipleExemple compliqué:Exemple compliqué:

Point

PointColorie Cercle

CercleColorie

Page 69: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Héritage.Héritage.Héritage.Héritage.

Héritage MultipleHéritage MultipleExemple compliqué:Exemple compliqué:

Point

PointColorieCercle

CercleColorie

Couleur

Page 70: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 71: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Chapitre 6Chapitre 6Chapitre 6Chapitre 6

PolymorphismePolymorphismePolymorphismePolymorphisme

Page 72: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 73: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

Page 74: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ;}}

Page 75: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 76: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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) { …}

Page 77: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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

Page 78: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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();}}

Page 79: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

Chapitre 8Chapitre 8Chapitre 8Chapitre 8

Standard Template LibraryStandard Template LibraryStandard Template LibraryStandard Template Library

Page 80: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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))

Page 81: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ;

Page 82: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 83: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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());());

Page 84: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 85: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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)

Page 86: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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()

Page 87: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;

Page 88: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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;}}

Page 89: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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.

Page 90: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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 ; } }

Page 91: HistoriqueHistorique 1985 1985 Langage C++, parution du livre Bjarne Stroustrup bs/homepage.html 1998 Normalisation ANSI

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