Académique Documents
Professionnel Documents
Culture Documents
C++
Directives de compilation
#include <iostream.h> // répertoire standard de fichiers
#include "mabiblio.h" // fichier ou module stocké ailleurs
Déclaration globales
const float PI = 3.14159 ; // [variables ou foncions]
Suite de fonctions
void lire_annee(int annee) {
/* … instructions et structures de contrôle */ }
Programme principal
void main()
{ /* … construction d’objets & messages … */ }
Fonctions 6
Surcharge de fonctions
void
void affiche(int
affiche(int nb)
nb) {{ printf("%d\n",
printf("%d\n", nb
nb ;; }}
void
void affiche(float
affiche(float nb)
nb) {{ printf("%.2f\n",
printf("%.2f\n", nb
nb ;; }}
//// 22 définitions
définitions différentes
différentes de
de la
la fonction
fonction affiche()
affiche()
void
void main()
main() {{
int
int i=4
i=4 ;; float
float x=10.5
x=10.5 ;;
affiche(i)
affiche(i) ;; //// affichage
affichage d'un
d'un entier
entier
affiche(x)
affiche(x) ;; }} //// affichage
affichage d'un
d'un réel
réel
Classes & Objets 9
Mercure
Terre
Vénus Soleil
Description et
comportement de la Planete
notion planète
Membres Membres
données fonctions
- Déclaration : données + prototypes fonctions
- Définition des fonctions de la classe.
Classes & Objets 11
Class
Class Planete
Planete {{
Public
Public ::
void
void definition(void)
definition(void) ;; //// saisie saisie
void
void deplacer(float)
deplacer(float) ;; //// mise
mise àà jour
jour
void
void position(void)
position(void) ;; //// affichage
affichage des
des données
données
Private
Private ::
char
char nom[20]
nom[20] ;; //// nom
nom
float
float vitesse
vitesse ;; //// vitesse
vitesse orbitale
orbitale
float
float distance
distance ;; //// distance
distance au au soleil
soleil
float
float oldX,
oldX, oldY
oldY ;; //// ancienne
ancienne position
position
float
float X,
X, YY ;; //// position
position actuelle
actuelle
void
void trace(void)
trace(void) ;; /*
/* mémoriser
mémoriser position
position actuelle
actuelle /*
/* }} ;;
Classes & Objets 12
Encapsulation de membres
- Tout programme utilisant un objet d'une certaine classe
ne peut accéder qu'aux membres publics ;
- Les membres privés d'une classe ne sont accessibles qu'à
l'intérieur de cette classe.
notre
exemple - Ce mécanisme, qui empêche l'accès direct à des
membres privés, s'appelle l'encapsulation.
inline
inline void
void Planete::trace(void)
Planete::trace(void) //// mémoriser
mémoriser position
position actuelle
actuelle
{{ oldX
oldX == X
X ;; //// accès
accès direct
direct autorisé
autorisé aux
aux données
données privées,
privées,
oldY
oldY == Y
Y ;; //// seulement
seulement àà l'intérieur
l'intérieur de
de la
la classe
classe Planete
Planete
}}
Classes & Objets 14
void
void Planete::position(void)
Planete::position(void)
{{ cout
cout <<"Planète:
<<"Planète: "" <<nom
<<nom <<"\n"
<<"\n" ;;
cout
cout <<"Ancienne
<<"Ancienne position
position (x,y)
(x,y) :: "" <<oldX
<<oldX <<","
<<"," <<oldY
<<oldY ;;
cout
cout <<"Nouvelle
<<"Nouvelle position
position (x,y)
(x,y) :: "" <<X
<<X <<","
<<"," <<Y
<<Y <<"\n"
<<"\n" ;;
}}
Planete
Planete merure,
merure, venus
venus ;;
/*
/* Ces
Ces objets
objets peuvent
peuvent accéder
accéder àà leurs
leurs membres
membres publics
publics en
en
utilisant
utilisant l'opérateur
l'opérateur point
point (.)
(.) */
*/
Classes & Objets 16
class
class Planete
Planete
{{ public
public ::
Planete(char
Planete(char *nm,
*nm, float
float dis,
dis, float
float vit,
vit, float
float x,
x, float
float y)
y) ;;
//// …
… autres
autres membres
membres publics
publics
private
private ::
//// …
… membres
membres privés
privés
};
};
#include
#include <string>
<string>
Planete::Planete(char
Planete::Planete(char *nm,
*nm, float
float dis,
dis, float
float vit,
vit, float
float x,
x, float
float y)
y)
{{ strcpy(nom,
strcpy(nom, nm)nm) ;;
distance=dis
distance=dis ;; vitesse=vit
vitesse=vit ;; X=x
X=x ;; Y=y
Y=y ;;
trace()
trace() ;; }}
Classes & Objets 18
Destructeur
Fonction appelée automatiquement par le programme
pour détruire l'objet dont la durée de vie se termine.
class
class Planete
Planete
{{ public
public ::
~Planete(void)
~Planete(void) //// prototype
prototype fonction
fonction destructeur
destructeur d'objets
d'objets
//// …
… membres
membres publics
publics (y(y compris
compris constructeur)
constructeur)
private
private ::
//// …
… membres
membres privés
privés
}} ;;
Planete::
Planete:: ~Planete(void)
~Planete(void) //// définition
définition du
du destructeur
destructeur d'objets
d'objets
{{ cout
cout <<"La
<<"La planète
planète "" <<nom
<<nom <<" <<" aa été
été détruite
détruite !! \n"
\n" ;; }}
Classes & Objets 19
#include "Planete.h"
ASTRO.CPP
void main()
fichier d'utilisation
{ Planete pluton ;
des classes (programme).
/* … suite programme */ } ;
Classes & Objets 20
Tableau d'objets
Fonction amie
Matrice Vecteur
mat[3][3] Privé vect[3]
class
class Matrice
Matrice class
class Vecteur
Vecteur
{{ //// …
… {{ //// …
…
friend
friend Vecteur
Vecteur multiplie(…)
multiplie(…) ;; }} friend
friend Vecteur
Vecteur multiplie(…)
multiplie(…) ;; }}
Une fonction amie peut être aussi membre d'une des deux
classes et être déclarée amie de l'autre ( page suivante ), …
Classes & Objets 22
Classes amies
Méthode d'une classe amie d'une autre classe
class
class A A ;;
class
class B B {{ //// …
…
void
void acces(
acces( A A& & param1,
param1, …)
…) ;; }} ;;
class
class A A
{{ friend
friend B::acces(
B::acces( A A& & param1,
param1, …)…) ;;
//// …
… }} ;; //// acces()
acces() est
est une
une méthode
méthode de
de B B ;; elle
elle est
est amie
amie de
de A
A
class
class BB {{ //// …
… }} ;;
class
class AA
{{ friend
friend class
class B
B ;; }} ;; //// toute
toute méthode
méthode de
de B
B est
est amie
amie de
de A
A
Classes & Objets 23
Surcharge d'opérateurs
typeResultat operatorop(paramètres) ; // prototype fonction opérateur
class
class Vecteur
Vecteur ;; //// vecteur
vecteur des des entiers
entiers àà 22 dimensions
dimensions
{{ public
public ::
Vecteur(int
Vecteur(int x, x, int
int y)
y) ;;
Vecteur
Vecteur operator+(
operator+( Vecteur Vecteur & & bb )) ;;
//// …
… }} ;;
Vecteur
Vecteur Vecteur::operator+(
Vecteur::operator+( Vecteur Vecteur & & bb ))
{{ double
double sx, sx, sy
sy ;;
sx
sx == xx ++ b.lectureX()
b.lectureX() ;; //// x,yx,y :: données
données privées
privées de
de Vecteur,
Vecteur,
sy
sy == yy ++ b.lectureY()
b.lectureY() ;; //// et
et lecture?()
lecture?() :: méthodes
méthodes publiques
publiques
Vecteur
Vecteur sum(sx,
sum(sx, sy) sy) ;; //// déclaration
déclaration avecavec initialisateur
initialisateur
return
return sum sum ;;
}} ;;
Classes & Objets 25
Vecteur
Vecteur Vecteur::operator+(
Vecteur::operator+( Vecteur&
Vecteur& bb ))
{{ //// …
…
sx
sx == xx ++ b.x
b.x ;; //// x,y
x,y :: données
données privées
privées de
de
Vecteur
Vecteur sy
sy == yy ++ b.y
b.y ;; //// accès
accès direct
direct àà (x,
(x, y)
y)
du
du vecteur
vecteur bb
//// …
…
}} ;;
Classes & Objets 26
Donnée statique
Rattachée à une classe (1 exemplaire) et partagée par tous les
objets de la même classe.
class
class Epargne
Epargne //// Gestion
Gestion de
de carnets
carnets d'épargne
d'épargne
{{ static
static float
float taux
taux ;;
/*
/* …
… autres
autres déclarations
déclarations de
de la
la classe
classe */
*/ }} ;;
//// et
et dans
dans le
le fichier
fichier de
de définition
définition de
de la
la classe
classe on
on initialise
initialise ::
float
float Epargne::taux
Epargne::taux == 4.75
4.75 ;; OU
OU
float
float
Epargne::taux(4.75);
Epargne::taux(4.75);
Classes & Objets 27
Fonction statique
Elle a une action indépendante d'un quelconque objet. Elle est
appelée sans mentionner un objet particulier (juste la classe).
class
class Epargne
Epargne //// Gestion
Gestion de
de carnets
carnets d'épargne
d'épargne
{{ static
static float
float taux
taux ;;
public
public ::
static
static void
void changeTaux(float
changeTaux(float nouv)
nouv) {{ taux
taux == nouv
nouv ;; }} ;;
};
};
//// Exemple
Exemple d'utilisation
d'utilisation dans
dans le
le main()
main()
Epargne::changeTaux(4.25)
Epargne::changeTaux(4.25) ;;
Classes & Objets 28
class
class Vecteur
Vecteur
{{ /* /* …
… déclarations
déclarations de
de la
la classe
classe */ */ }} ;;
//// ...
... dans
dans le
le main()
main()
Vecteur
Vecteur ** ptrV1ptrV1 ;; //// ptrV1
ptrV1 contient
contient l'adresse
l'adresse d'un
d'un vecteur
vecteur dynamique
dynamique
ptrV1
ptrV1 == new new Vecteur
Vecteur ;; //// initialisation
initialisation :: appel
appel constructeur
constructeur
ptrV1
ptrV1 ->
-> afficheVect()
afficheVect() ;; //// accès
accès aux
aux membres
membres d'un
d'un objet
objet dynamique
dynamique
delete
delete ptrV1
ptrV1 ;; //// l'utilisateur
l'utilisateur doit
doit lui
lui même
même effacer
effacer ces
ces objets
objets
delete
delete []
[] ptrTableau
ptrTableau ;; //// delete
delete dans
dans le
le cas
cas d'un
d'un tableau
tableau d'objets
d'objets
//// delete
delete appelle
appelle automatiquement
automatiquement le
le destructeur
destructeur d’objets
d’objets
Classes & Objets 29
Constructeur de copie
Voiture::Voiture(char
Voiture::Voiture(char *m,
*m, floatfloat d,
d, int
int l)l)
:: rAvantD(d,
rAvantD(d, l)l) ,, rAvantG(d,
rAvantG(d, l)l) ,, rArrD(d,
rArrD(d, l)l) ,,
rArrG(d,
rArrG(d, l)l)
//// initialisateurs
initialisateurs de
de membres
membres
objets
objets
{{ strcpy(
strcpy( marque,
marque, m
m )) ;; }}
//// un
un exemple
exemple de
de déclaration
déclaration d'objet
d'objet pourrait
pourrait être
être ::
Voiture
Voiture maVoiture("Ford",
maVoiture("Ford", 13,
13, 185)
185) ;;
Garantie de non modification : const 32
Objets constants
T const X(…) ; // X : objet constant de type T (NON modifiable)
T const * P ; T * PP ; ...
PP = P ; T & RR(* P) ; // sont des écritures interdites.
Héritage & Polymorphisme 35
Héritage
classe B classe dérivée
Employe
Graphe d'héritage de
la hiérarchie d'employés Temporaire Cadre
Vendeur
class
class Employe
Employe
{{ public
public ::
Employe(
Employe( const
const char*
char* nm
nm )) ;; //// constructeur
constructeur d’objets
d’objets
void
void coutNom()
coutNom() ;; //// affiche
affiche le
le nom
nom
//// …
…
private
private ::
char
char nom[30]
nom[30] ;; }} ;;
class
class Temporaire
Temporaire :: public
public Employe
Employe
{{ public
public ::
Temporaire(
Temporaire( constconst char*
char* nm nm )) ;; //// constructeur
constructeur d'objets
d'objets
void
void setTatif(
setTatif( float
float trf
trf )) ;;
void
void setHeures(
setHeures( float
float hres
hres )) ;;
private
private ::
float
float tarif
tarif ,, heures
heures ;; }} ;;
class
class Vendeur
Vendeur :: public
public Temporaire
Temporaire
{{ public
public ::
Vendeur(
Vendeur( const
const char*
char* nm nm )) ;; //// constructeur
constructeur d'objets
d'objets
void
void setCommision(
setCommision( float
float comm
comm )) ;;
void
void setVentes(
setVentes( float
float ven
ven )) ;;
private
private ::
float
float commission,
commission, ventes
ventes ;; }} ;;
class
class Cadre
Cadre :: public
public Employe
Employe
{{ public
public ::
Cadre(
Cadre( const
const char*
char* nmnm )) ;; //// constructeur
constructeur d'objets
d'objets
void
void setSalaire(
setSalaire( float
float sal
sal )) ;;
private
private ::
float
float salaire
salaire ;; }} ;;
//// exemple
exemple d'utilisation
d'utilisation
Vendeur
Vendeur vv11("Salim")
("Salim") ;;
vv11.setVentes(1000)
.setVentes(1000) ;; //// appel
appel Vendeur::setVentes()
Vendeur::setVentes()
vv11.setHeures(40.0)
.setHeures(40.0) ;; //// appel
appel Temporaire::setHeures()
Temporaire::setHeures()
//// …
…
vv11.coutNom(
.coutNom( )) ;; //// appel
appel Employe::coutNom()
Employe::coutNom()
Héritage & Polymorphisme 42
//// constructeur
constructeur de
de la
la classe
classe de base Temporaire
de base Temporaire
Temporaire::Temporaire(
Temporaire::Temporaire( const const char
char ** nm
nm ))
:: Employe(
Employe( nmnm )) ////
initialisateur
initialisateur
{{ tarif
tarif == 0.0
0.0 ;; heures
heures == 0.0
0.0 }} ;;
//// constructeur
constructeur de
de la
la classe dérivée Vendeur
classe dérivée Vendeur
Vendeur::Vendeur(
Vendeur::Vendeur( const
const char*
char* nm
nm )) :: Temporaire(
Temporaire( nm
nm ))
{{ commission
commission == 0.0
0.0 ;; ventes
ventes == 0.0
0.0 }} ;;
Héritage & Polymorphisme 43
Membres protégés
class
class Exemple
Exemple
{{ public
public :: //// membres
membres publics
publics
int
int nombre
nombre ;;
protected
protected :: //// membres
membres protégés
protégés
int
int secret
secret ;;
private
private :: //// membres
membres privés
privés
int
int topSecret
topSecret }} ;;
Types de dérivation
Publique : les membres publics de la classe de base sont
considérés comme membres publics dans la classe dérivée
class Cadre : public Employe { // … }
Fonctions virtuelles
class
class Employe
Employe
{{ public
public ::
virtual
virtual float
float calculSalaire()
calculSalaire() const
const {{ return
return 00 ;; }} ;; //// fonction
fonction
//// …
… }} ;; //// virtuelle,
virtuelle, ne
ne sera
sera jamais
jamais
appelée.
appelée.
class
class Temporaire
Temporaire :: public
public Employe
Employe
{{ public
public ::
float
float calculSalaire()
calculSalaire() ;; //// fonction
fonction implicitement
implicitement virtuelle
virtuelle
//// …
… }} ;;
//…
//… exemple
exemple d'utilisation
d'utilisation
Temporaire
Temporaire emp1Temp(
emp1Temp( "Salim"
"Salim" )) ;; //// objet
objet emp1Temp,
emp1Temp,
Temporaire
Temporaire ** ptrTemp1
ptrTemp1 == && emp1Temp
emp1Temp ;; //// avec avec pointeur
pointeur
cout
cout <<
<< ptrTemp1->
ptrTemp1-> claculSalaire()
claculSalaire() ;; //// Temporaire::calculSalaire()
Temporaire::calculSalaire()
Héritage & Polymorphisme 47
Héritage multiple
class
class C C :: public
public A,
A, public
public B
B classe de base A classe de base B
{{
//// …
…
}} ;; classe dérivée C
Classe virtuelle
Employe
Temporaire Cadre
Vendeur
héritage multiple
ChefVentes
class
class Employe
Employe
{{ //// …
… }} ;;
class
class Temporaire
Temporaire :: public
public virtual
virtual Employe
Employe
{{ //// …
… }} ;; //// virtual
virtual :: une
une copie
copie d’Employe
d’Employe dans
dans
Chefventes
Chefventes
class
class Vendeur
Vendeur :: public
public Temporaire
Temporaire
{{ //// …
… }} ;;
class
class Cadre
Cadre :: public
public virtual
virtual Employe
Employe
{{ //// …
… }} ;; //// virtual
virtual :: une
une copie
copie d’Employe
d’Employe dans
dans Chefventes
Chefventes
class
class ChefVentes
ChefVentes :: public
public Vendeur
Vendeur ,, public
public Cadre
Cadre
{{ //// …
… }} ;;
Classe générique 50
Définition et exemple
Classe générique : sert de patron (template), c'est à dire modèle
pour d'autres classes, et dans laquelle ce modèle peut être
paramétré par d'autres classes, objets, et/ou opérations .
Exemple d'une pile : si l'on doit construire une classe Stack qui
gère une pile sous forme de tableau dynamique, cette gestion est
identique quel que soit le type de ses éléments :
template
template <class
<class T> T> class
class Stack Stack //// pile
pile d'éléments
d'éléments dede type
type TT
{{ public
public ::
Stack(
Stack( int
int ss )) ;; //// constructeur
constructeur
~Stack(
~Stack( )) {{ delete[]
delete[] adr adr ;; }} ;; //// destructeur
destructeur
void
void push(
push( TT elemelem )) ;; //// prototype
prototype fonction
fonction empiler
empiler
TT pop(
pop( void
void )) ;; //// prototype
prototype fonction
fonction dépiler
dépiler
int
int empty(
empty( void
void )) const const {{ returnreturn (( top top ==== NULL
NULL )) ;; }}
int
int full(
full( void
void )) ;; //// pile
pile pleine
pleine ??
int
int howmany(
howmany( void void )) ;; //// nombre nombre d'éléments
d'éléments dans
dans la
la pile
pile
private
private ::
TT ** top
top ;; //// pointeur
pointeur sur sur sommet
sommet
TT ** adr
adr ;; //// adresse
adresse zonezone dynamique
dynamique
int
int size
size ;; }} //// taille
taille en
en nombre
nombre d'éléments
d'éléments dede type
type TT
Classe générique 53
template
template <class
<class T>
T> Stack<T>::Stack(
Stack<T>::Stack( int
int ss )) //// constructeur
constructeur
{{ adr
adr == new
new T[s]
T[s] ;; top
top == NULL
NULL ;; size
size == ss ;; }}
template
template <class
<class T>
T> void
void Stack<T>::puch(
Stack<T>::puch( TT elem
elem )) //// empiler
empiler
{{ ifif (( top
top ==== NULL
NULL )) top
top == adr
adr ;; else
else top++
top++ ;;
** top
top == elem
elem ;; }}
template
template <class
<class T> T> TT Stack<T>::pop(void)
Stack<T>::pop(void) //// dépiler
dépiler
{{ TT elem
elem ;;
elem
elem == ** toptop ;;
ifif (( top
top ==== NULL
NULL )) toptop == NULL;
NULL; else
else top--
top-- ;;
return
return elem elem ;; }}
Classe générique 54
template
template <class
<class T>
T> int
int Stack<T>::full(void)
Stack<T>::full(void) //// pile
pile pleine
pleine ??
{{ ifif (( top
top !=
!= NULL
NULL )) return
return (( size
size ==== top
top –– adr
adr +1
+1 )) ;;
else
else return
return 00 ;; }}
template
template <class
<class T>
T> int
int Stack<T>::howmany(void)
Stack<T>::howmany(void) //// taille
taille
{{ ifif (( top
top ==
== NULL
NULL )) return
return 00 ;; else
else return
return (top
(top –– adr
adr +1)
+1) ;; }}
Stack
Stack <int>
<int> pileInt(20)
pileInt(20) ;; //// déclaration
déclaration d'une
d'une pile
pile pour
pour 20
20 entiers
entiers
Stack
Stack <char>
<char> pileCar(50)
pileCar(50) ;; //// une
une pile
pile pour
pour 50
50 caractères
caractères
Classe générique 55
#include
#include "Stack.h"
"Stack.h"
void
void main()
main()
{{ Stack
Stack <int>
<int> pileI(10)
pileI(10) ;; //// pile
pile pour
pour 10
10 nombres
nombres entiers
entiers
int
int ii == 11 ;;
while
while (( !! pileI.full()
pileI.full() ))
{{ pileI.push(i++)
pileI.push(i++) ;;
cout
cout <<
<< "\n
"\n IlIl yy aa "" <<
<< pileI.howmany()
pileI.howmany() ;;
cout
cout <<
<< "" éléments
éléments dansdans la
la pile"
pile" ;; }}
while
while (( !pileI.empty()
!pileI.empty() ))
cout
cout <<
<< "\n"
"\n" <<
<< pileI.pop()
pileI.pop() ;;
}}
Classe générique 56
class
class Vecteur
Vecteur //// àà 33 composantes
composantes pour
pour utilisation
utilisation ultérieure
ultérieure
{{ public
public ::
Vecteur(
Vecteur( float
float c1=0,
c1=0, floatfloat c2=0,
c2=0, float
float c3=0
c3=0 )) ;;
friend
friend affiVect
affiVect & & operator<<(
operator<<( affiVect
affiVect && affi,
affi, Vecteur
Vecteur && vv );
);
private
private :: float
float vect[3]
vect[3] ;; }} ;;
Vecteur::Vecteur(
Vecteur::Vecteur( floatfloat c1,
c1, float
float c2,
c2, float
float c3
c3 ))
{{ vect[0]=c1
vect[0]=c1 ;; vect[1]=c2
vect[1]=c2 ;; vect[2]=c3
vect[2]=c3 ;; }}
//// surcharge
surcharge pour
pour affichage
affichage du
du vecteur
vecteur
affiVect
affiVect &
& operator<<
operator<< (( affiVect
affiVect && affi,
affi, Vecteur
Vecteur && vv ))
{{ affi
affi << "\n" <<v.vect
<<"\n" [0] <<",
<<v.vect[0] <<", "" <<v.vect [1] <<",
<<v.vect[1] <<", "" <<v.vect [2] ;;
<<v.vect[2]
return
return affi
affi ;; }}
Classe générique 57
//// exemple
exemple d'utilisation
d'utilisation
#include
#include "Stack.h"
"Stack.h" //// fichier
fichier déclaration
déclaration classe
classe générique
générique
void
void main()
main()
{{ Stack
Stack <Vecteur>
<Vecteur> pileV(5)
pileV(5) ;; //// pile pile pour
pour 55 vecteurs
vecteurs
int
int ii =10
=10 ;;
Vecteur
Vecteur v( v( i,i, i++,
i++, i+2
i+2 )) ;;
while
while (( !! pileV.full()
pileV.full() )) //// on
on empile
empile 55 fois
fois le
le même
même vecteur
vecteur
{{ pileV.push()
pileV.push() ;;
cout
cout << << "\n
"\n IlIl yy aa "" <<<< pileV.howmany()
pileV.howmany() ;;
cout
cout << << "éléments
"éléments dans dans la
la pile"
pile" ;; }}
while
while (( !pileV.empty()
!pileV.empty() ))
{{ cout
cout << << "\n"
"\n" << << pileV.pop()
pileV.pop() ;; }}
C++ : Classe container 58
Définition et exemples
template
template <class
<class T>T> class
class Addition
Addition
{{
public
public ::
//// …
…
TT add(
add( TT obj1,
obj1, TT obj2
obj2 )) {{ return
return (obj1
(obj1++obj2)
obj2) ;; }}
}} ;;
//// …
… exemple
exemple d'utilisation
d'utilisation
void
void main()
main()
{{ Addition<int>
Addition<int> intAdd
intAdd ;;
cout
cout <<
<< intAdd.add(5,
intAdd.add(5, 10)
10) ;;
}}