classes-1-2
DESCRIPTION
Chap3-suiteTRANSCRIPT
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 1
o DCLARATION ET DFINITION DUNE CLASSEo CONSTRUCTEUR ET DESTRUCTEURo SURCHARGE DES OPRATEURSo BIBLIOTHQUE DE FLOTSo DONNES STATIQUESo GNRICIT
1
Chapitre 3 : Les classes
Prambule2
Rappel : les structures en Cstruct point {
int x ;int y ;
} ;
x et y : ce sont des champs ou des membres de la structure point.
En C++ :Associer une structure, en plus des donnes, des fonctions nommes
fonctions membres ou mthodes .
En POO pure, les donnes sont encapsules => leur accs ne peut se faire que par le biais des mthodes.
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 2
Dclaration et dfinition dune classe
3
Une syntaxe possible pour la dfinition dune classe est :
class{
// dclaration des attributs
...
public ://
Prototype et dfinition des mthodes
...
};
La classe est dfinie laide dun bloc et se termine par un ;
private :
Exemple4
class point
{ // dclaration des membres privs
private :
int x ;
int y ;
// dclaration des membres publics
public :
void initialise (int, int) ;
void deplace (int, int) ;
void affiche () ;
} ;
void main(){
point p;
p.initialise(-2,5);}
Dclaration de la classe point
Instanciation de la classe pointen un objet p
On applique la mthode initialise l'objet p
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 3
Protection/visibilit5
class point
{ // dclaration des membres privs
private :
int x ;
int y ;
// dclaration des membres publics
public :
void initialise (int, int) ;
void deplace (int, int) ;
void affiche () ;
} ;
void main()
{
Point p;
p.initialise(5,2);
p.deplace(3,6);
p.affiche();
p.x=5;
}Illgal
Protection/visibilit6
class point
{ // dclaration des membres privs
private :
int x ;
int y ;
// dclaration des membres publics
public :
void initialise (int, int) ;
void affiche () ;
Private :
void deplace (int, int) ;
} ;
void main()
{
Point p;
p.initialise(5,2);
p.deplace(3,6)
} Illgal
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 4
Exploitation dune classe7
Trois types dinstructions : Dclaration de la classe
Dfinition de la classe
Utilisation de la classe
En pratique, on aura souvent intrt dcoupler la classe de son utilisation.
On sera alors gnralement amens isoler les instructions dedclarationde la classe dans un fichier en-tte (extension .h) quil suffira dinclure(par #include) pour compiler lapplication.
Exploitation dune classe8
class point
{ /* dclaration des membres privs */int x ;
int y ;
public : /* dclaration des membres publics */
void initialise(int, int);
void deplace (int, int) ;
void affiche () ;
} ;
Fichier entte point.h
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 5
Exploitation dune classe9
#include
#include "point.h" // pour introduire les dclarations de la classe point
using namespace std ;
/* Dfinition des fonctions membres de la classe point */
void point::initialise(int abs,int ord)
{x=abs; y=ord;
}
void point::deplace (int dx, int dy)
{ x = x + dx ; y = y + dy ;
}
void point::affiche ()
{ cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 6
Exploitation dune classe11
#include #include "point.h"
void main()
{
point p;
p.initialise(5,2);
p.deplace(3,6);
p.affiche();
}
Utilisation de la classe point
Inclusions multiples12
Dans certaines circonstances (quon verra plus tard), l'utilisateur d'uneclasse peut tre amen,sans qu'il en ait conscience, inclure plusieursfois un mme fichier en-tte lors de la compilation d'un mme fichiersource.
Erreurs de compilation, lies tout simplement la redfinition de laclasse concerne.
En gnral, on rglera ce problme en protgeant systmatiquementtout fichier en-tte des inclusions multiples par une technique de compilation conditionnelle, comme dans :
#ifndef POINT_H#define POINT_H// dclaration de la classe point#endif
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 7
13
Affectation dobjets
class point{ int x,y ;
};
void main(){
point a,b;
b=a;}
Provoquera la recopie des valeurs des membres x et y de a dans les membres correspondants de b.
class A {
public :
int f() { return i;}
void f(int val) { i=val;}
private :
int i;
};
Surcharge des mthodes
14
void main ()
{
A a;
a.f(10);
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 8
Modifieurs et Accesseurs 15
La clause optionnelleconst, situeaprs la signature dsigne une mthodede type accesseur (c.a.d. ne change pasl'tat de l'instance)
class A {
public :
int get_i(){ returni;}
void set_i( int val) { i=val;}
private :
int i;
};
...
int get_i() const
{
i = 0;
return i;
}
Mthodes inline16
Les fonctions en ligne (ou inline) permettent daccrotre l'efficience d'unprogramme dans le cas de fonctions courtes.
Pour rendre en ligne une fonction membre, on peut :
soit fournir directement la dfinition de la fonction dans la dclarationmme de la classe ; dans ce cas, le qualificatifinline n'a pas tre utilis ;
soit procder comme pour une fonction ordinaire en fournissant unedfinition en dehors de la dclaration de la classe ; dans ce cas, lequalificatif inline doit apparatre la fois devant la dclaration et devantl'en-tte.
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 9
Mthodes inline17
class A {
public :
inline void g( int val);
void f(int x) {i=x;}
private :
int i; };
inline void A::g(int val){ i=val;}
Mthodes inline
Cration/Destruction dobjets 18
point p1;
p1.initialise(1,2);
En cas doubli de cette instruction, quelles seront les
valeurs de p.x et p.y?
class point{ /* dclaration des membres privs */
int x ;int y ;public : /* dclaration des membres publics */
void initialise(int, int);void deplace (int, int) ;void affiche () ;
} ;
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 10
Constructeur19
Une fonction membre portant le mme nom que sa classe se nommeconstructeur,
Un constructeur peut avoir des arguments mais ne renvoie pas de valeur(aucune indication de type mme pasvoid ),
Le constructeur est appel automatiquement chaque cration d'unobjet.
Destructeur20
Une fonction membre portant le mme nom que sa classe, prcde dusymbole (~), se nommedestructeur,
Un destructeur ne peut pas comporter darguments et il ne renvoie pas devaleur (aucune indication de type ne doit tre prvue ),
Le destructeur est appel implicitement avant la libration de lespacemmoire associ lobjet.
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 11
Constructeur / Destructeur 21
class point{ /* dclaration des membres privs */
int x ;int y ;
public : /* dclaration des membres publics */point(int, int); //constructeur void deplace (int, int) ;void affiche () ;
~point(); //destructeur
} ;
Le constructeur est appel aprs la cration de lobjet,Le destructeur est appel avant la destruction de l'objet.
22
les deux dclarations suivantes seront incorrectes :
point a ; // incorrect : le constructeur attend deux argument s
point b (3) ; // incorrect (mme raison)
point a(1, 7) ; // correct car le constructeur possde deux arguments
/*S'il existe plusieurs constructeurs, il suffit que ladclaration comporte les arguments requis par l'un d'entreeux. Ainsi, si on ajoute le constructeur suivant :*/
point ( ) ; // constructeur 1
point (int, int) ; // constructeur 2
point a(5) ; // incorrect : aucun constructeur un argument
point a ; // correct : appel du constructeur 1
point b(1, 7) ; // correct : appel du constructeur 2
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 12
Constructeur / Destructeur
Le corps du constructeur peut tre prcd par une sectionoptionnelle introduite par ":" , spcifiquement rserve l'initialisation des attributs.
Il est possible de changer la valeur des attributs dans le corps duconstructeur.
Les attributs non initialiss dans cette section prendront une valeurpar dfaut dans le cas o une telle valeur existe.
A::A(int val)
: i(val)
{
i = ...;
}
initialisation
affectation
23
24
Les objetsautomatiquessont ceux crs par une dclaration Dans une fonction
Dans un bloc
Lobjet est cr lors de la rencontre de sa dclaration. Il est dtruit la fin de l'excution de la fonction ou du bloc.
Constructeur / Destructeur
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 13
class A {public :
A();
...
~A();...
};
void main ()
{
A a;
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 14
27
Les objetsdynamiquessont des objets pour lesquels lespace mmoirerequis par lobjet est allou dynamiquement.
Aprs l'allocation dynamique, l'oprateurnewappellera un constructeur delobjet.
Avant la libration de l'emplacement mmoire correspondant, l'oprateurdeleteappellera le destructeur.
Constructeur / Destructeur
class A {public :
A();
...
~A();...
};
void main ()
{
A *ptr;
...
ptr = new A;
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 15
class A {public :
A();A(int);
int f(); ...
~A();};
void main (){
A a1;
A a2(5);
A * ptr;
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 16
31
point a(1,1) ; // un objet statique de classe point
void main(){cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 17
Constructeur par dfaut
Lorsqu'on ne dfinitaucun constructeurpour une classe, le compilateur secharge de gnrer automatiquement un constructeur par dfaut (minimaliste= initialisation par dfaut des attributs).
class A {
int i;
public :
A():i(10){ }
};
class B {
int j;
public :
B() : j(0) { }
};
class C {
.
A objA;
B objB;
};
C() :
objA() objB()
{ }
auto-gnr
33
Pas de constructeurpour la classe C
Constructeur par dfaut 34
class A {
int i;
public :
A():i(10){ }
};
class B {
int j;
public :
B(int x) : j(x) { }
};
class C {
.
A objA;
B objB;
};
main()
{
C objc;
}
erreur
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 18
ExerciceEcrivez une classeVecteur comportant : commemembres donnes (attributs) privs: trois composantes de type
double,
commefonctions membres (mthodes) publiques:
-Un constructeur avec 3 arguments,-Un constructeur sans arguments (initialisant chaque composante 0) ;-homothtie pour multiplier les composantes par une valeur fournie en
argument,
-affiche pour afficher les composantes du vecteur. Ajoutez la premire classe Vecteur prcdente une fonction membre
nommeprod_scal fournissant en rsultat le produit scalaire de deuxvecteurs.
Ajoutez la classe Vecteur une fonction membre nommesommepermettant de calculer la somme de deux vecteurs.
36
class vect{
int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments
public :vect (int n) // constructeur "usuel"{ adr = new double [nelem = n] ;
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 19
37
class vect{
int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments
public :vect (int n) // constructeur "usuel"{ adr = new double [nelem = n] ;
cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 20
39
5 5
a b
La fonction f admet un paramtre pass par valeur. Donc lexcution def sefait sur unecopiede lobjeta dsigne parb.
A la fin de l'excution de la fonctionf , le destructeur~vecteur est appelpourb, cequi libre l'emplacement point paradr ;
A la fin de lexcution de la fonctionmain , le destructeur est appel poura, iltente de librer le mme emplacement.
Cette tentative constitue une erreur d'excution dont les consquences varientavec limplmentation : afin de rsoudre un tel problme, on utilise leconstructeur de recopie.
Constructeur de recopie
Constructeur de recopie
A::A(const A & a)
: i(a.i)
{
i = ...;
}
Forme gnrale
(const < id_classe > & obj) : ...
{
}
void main()
{
A a1;
A a2(a1);
}
10
10
a1
a2
40
Le constructeur de recopie ne retourne rien et a le mme nom que la classe.
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 21
41
Lorsque le constructeur de recopie n'est pas dfini, le compilateur gnreun de manire automatique qui copie les attributs en invoquant lesconstructeurs de recopie de chacun d'eux : celui-ci nest pas toujoursadquat , et lexemple prcdent le prouve.
Constructeur de recopie
42class vect{
int nelem ; // nombre d'lmentsdouble * adr ; // pointeur sur ces lments
public :vect (int n) // constructeur "usuel"{}
vect (const vect & v) // constructeur de recopie{ adr = new double [nelem = v.nelem] ; // cration nouvel objet
// copie de l'ancien tableauint i ; for (i=0 ; i
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 22
void fct (vect b){ cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 23
45
o Fonction extrieure la classe ayant accs aux donnes prives de laclasse.
o Contraire la POO mais utile parfois.
o Plusieurs situations damiti :
Fonction indpendante, amie d'une classe,
Fonction membre d'une classe, amie d'une autre classe,
Fonction amie de plusieurs classes,
Toutes les fonctions membres d'une classe, amies d'une autre classe.
Friend type_retour NomFonction (arguments)
Fonction amie
46
#include
using namespace std ;
class point
{ int x, y ;
public :
point (int abs=0, int ord=0) // un constructeur ("inl ine")
{ x=abs ; y=ord ; }
// dclaration fonction amie (indpendante) nomme coincide
friend int coincide (point, point) ;
} ;
int coincide (point p, point q) // dfinition de coi ncide
{ if ((p.x == q.x) && (p.y == q.y)) return 1 ;
else return 0 ;
}
Fonction amie
fonction indpendante, amie d'une classe
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 24
47
class A {
// partie prive .....
// partie publique .....
friend int B::f (char, A) ;
} ;
int B::f (char ..., A ...)
{ // on a accs ici aux membres privs de tout objet A}
Class B{int f(char, A);};
fonction membre d'une classe, amie d'une autre classe
Fonction amie
48
class A
{ // partie prive..... .....
// partie publique // partie publique
friend void f(A, B) ;
..... .....
} ;
Fonction amie
class B{ // partie prive..... .....
// partie publique // partie publique
friend void f(A, B) ;..... .....} ;
void f(A..., B...){ // on a accs ici aux membres privs de nimporte quel objet de type A ou B}
fonction amie de plusieurs classes
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 25
49
Il est plus simple d'effectuer une dclaration globale. Ainsi, pour dire quetoutes les fonctions membres de la classe B sont amies de la classe A,on placera, dans la classe A, la dclaration :
friend class B ;
Fonction amie
Toutes les fonctions membres d'une classe, amies d'une autre classe
50
class point
{ int x, y ;
public :
point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeur
void affiche () { cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 26
Surcharge doprateurs
Dans ce cas, la fonctionoperator + doit disposer de deux argumentsde typepoint et fournir une valeur de retour du mme type.
Elle peut tre une fonctionmembrede la classe concerne (classpoint dans ce cas) ou une fonctionindpendantedclareamiede laclasse concerne (puisquelle devra pouvoir accder aux membres privsde la classe) ;
51
52
1er cas : fonction membreclass point
{ int x, y ;
public :
point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeur
point operator + (point) ;
void affiche () { cout
-
Chapitre 3 : Les classes Niveau : II1
Prpar par : Raoudha CHEBIL 27
53
point operator + (point a, point b){ point p ;
p.x = a.x + b.x ; p.y = a.y + b.y ;return p ;
}c = a + b c=operator + (a, b)
Surcharge doprateurs
2eme cas : fonction amie
class point{ int x, y ;public :point (int abs=0, int ord=0) { x=abs ; y=ord ;} //con structeurfriend point operator + (point , point ) ;void affiche () { cout