Upload
carlo-coco
View
215
Download
1
Embed Size (px)
Citation preview
09/01/2016
1
Programmation Orientée Objet
par C++
ZAKRANI Abdelali
ENSAM – CASABLANCA
Année universitaire 2014-2015
ZAKRANI / POO par C++ / 14-15 2
Rappel
Fonctions (déclaration, transmission par valeur/référence, argument par défaut)
Variables locales et globales
Surdéfinition de fonctions
Structures: déclaration, initialisation et utilisation…
Les classes
Les objets
La séance dernière
Cette séance
09/01/2016
2
ZAKRANI / POO par C++ / 14-15 3
Notion de classe
Une classe est la généralisation de la notion de type
défini par l’utilisateur, dans lequel se trouvent associées
à la fois des données (membres données) et des
méthodes (fonctions membres)
Une classe est une structure dans laquelle seulement
certains membres et/ou fonctions membres seront
«publics», c.à.d. accessibles «de l’extérieur», les autres
membres étant dits «privés».
ZAKRANI / POO par C++ / 14-15 4
Exemple de déclaration d’une classe
• Les champs x et y sont les membres données de la classe
point. Ils sont déclarés privés. (private).
• Les fonctions membres nommées initialise, deplace et
affiche sont publiques. (public)
09/01/2016
3
ZAKRANI / POO par C++ / 14-15 5
Exem
ple
d’u
tilis
atio
n d
’une c
lass
e
x et y membres données
de la classe point Visibilité: privés
Trois fonctions membres
de la classe point
Visibilité:
publics
Définition de la
fonction affiche
Définition de la fonction initialise
Définition de la fonction deplace
En P.O.O., on dit que a et b sont des instances de la
classe point, ou encore que ce sont des objets de type
point.
Dans l’exemple précédent, tous les membres données de
point sont privés, ce qui correspond à une encapsulation
complète des données.
Il existe un troisième mot, protected (protégé), qui
s’utilise de la même manière que les deux autres ; il sert
à définir un statut intermédiaire entre public et privé,
lequel n’intervient que dans le cas de classes dérivées.
ZAKRANI / POO par C++ / 14-15 6
Utilisation d’une classe
09/01/2016
4
Est-il possible de remplacer l’instruction
b=a; par :
b.x = a.x ;
b.y = a.y ;
Soient les déclarations suivantes:
ZAKRANI / POO par C++ / 14-15 7
Affectation d’objets
Comme c’est le cas pour les
structures, on peut affecter à
b les valeurs de a:
b=a;
Un constructeur est une fonction membre (définie comme les autres fonctions membres) qui sera appelée automatiquement à chaque création d’un objet.
Son rôle est d’initialiser les données de l’objet créé.
Un objet pourra aussi posséder un destructeur, c’est-à-dire une fonction membre appelée automatiquement au moment de la destruction de l’objet.
Le constructeur porte le même nom que la classe.
Le destructeur porte le même nom que la classe, précédé d’un tilde (~).
ZAKRANI / POO par C++ / 14-15 8
Notions de constructeur et de
destructeur
09/01/2016
5
ZAKRANI / POO par C++ / 14-15 9
Exemple de classe comportant un
constructeur
La fonction initialise transformé
en un constructeur en la
renommant point
Commet utiliser cette classe comportant un constructeur?
La déclaration point a; convient-elle toujours?
À partir du moment où une classe possède un constructeur,
il n’est plus possible de créer un objet sans fournir les
arguments requis par son constructeur (sauf si ce dernier ne
possède aucun argument !).
Déclaration: point a(1,3) ; // correct
ZAKRANI / POO par C++ / 14-15 10
Exem
ple
de c
lass
e c
om
port
ant
un c
onst
ruct
eur
09/01/2016
6
ZAKRANI / POO par C++ / 14-15 11
Construction et destruction des
objets
Lorsque dans un même programme on crée différents
objets d’une même classe, chaque objet possède ses
propres membres données.
Par exemple :
ZAKRANI / POO par C++ / 14-15 12
Les membres données statiques
Une déclaration
telle que :
exple1 a, b ;
Objet a
Objet b
a.n
a.x
b.n
b.x
class exple1
{ int n ;
float x ;
.....
} ;
09/01/2016
7
Une façon de permettre à plusieurs objets de partager
des données consiste à déclarer avec le qualificatif static
les membres données qu’on souhaite voir exister en un
seul exemplaire pour tous les objets de la
ZAKRANI / POO par C++ / 14-15 13
Les membres données statiques
Une déclaration
telle que :
exple1 a, b ; Objet a Objet b
a.n
a.x
b.n
b.x
class exple1
{ static int n ;
float x ;
.....
} ;
On peut dire que les membres données statiques sont
des sortes de variables globales dont la portée est
limitée à la classe.
ZAKRANI / POO par C++ / 14-15 14
Exemple d’une classe comportant
un membre donnée statique
09/01/2016
8
struct point
{ int y ;
int x ;
void initialise (...) ;
....
} ;
1) Ces deux déclarations sont-elles équivalentes?
ZAKRANI / POO par C++ / 14-15 15
class point
{ public :
int y ;
int x ;
void initialise (...) ;
....
} ;
2) Cette déclaration est-elle correcte? class
{ int y ;
int x ;
void initialise (...) ;
....
} c, d ;
1) Supposons que l’on définisse une classe point disposant
d’un constructeur sans argument.
Quelle est la manière correcte pour déclarer un objet:
point a;
point a();
point() a;
ZAKRANI / POO par C++ / 14-15 16
2) Comment expliquer le fait que la déclaration d’un objet de
la classe point, par exemple, sans constructeur et avec un
constructeur sans argument sont pareilles?
point a;
09/01/2016
9
Déterminants d’un vecteur Soient v1 et v2, deux vecteurs définis par leurs coordonnées (x, y) et (x’, y’) extrémités, dans le plan euclidien orienté usuel.
Écrivez un programme, construit autour d’une classe vecteur, dont les fonctions membres (méthodes) afficheront les 2 vecteurs v1 et v2, puis calculeront les déterminants det(v1, v2) et det (v2, v1).
Les coordonnées extrémités des 2 vecteurs v1 et v2 seront imposées.
Résultat après exécution:
v1 (x, y) = (2, 3)
v2 (x, y) = (2.5, 7)
det(v1, v2) = xy'- yx‘
det(v1, v2) = 6.5
det(v2, v1) = x'y - y'x
det(v2, v1) = -6.5
ZAKRANI / POO par C++ / 14-15 17
Exercice
Déterminants d’un vecteur
#include <iostream>
using namespace std;
//classe vecteur
class vecteur{
float x,y;
public:
// déclaration du constructeur
vecteur (float, float);
//fonction membre affiche et det
void affiche(int);
float det(vecteur);
};
ZAKRANI / POO par C++ / 14-15 18
Solution
09/01/2016
10
//définition du constructeur
vecteur::vecteur(float i=0, float j=0){
x=i;
y=j;
}
//définition de la fonction affiche
void vecteur::affiche(int i){
cout<<"v"<<i<<" (x, y) = ("<<x<<", «<<y<<")"<<"\n\n";
}
//définition de la fonction det
float vecteur::det(vecteur w){
float determ;
determ=x*w.y-y*w.x;
return determ;
}
ZAKRANI / POO par C++ / 14-15 19
Solution (suite)
int main(){
//appel du constructeur vecteur, initialisation et
instanciation de v1 et v2
vecteur v1(2, 3), v2(2.5, 7);
//appel de la fonction affiche
v1.affiche(1);
v2.affiche(2);
//affichage des résultats et appel de la fonction
det
cout<<"det(v1, v2) = xy’- yx’"<<endl;
cout <<"det(v1, v2) = "<<v1.det(v2)<<"\n\n";
cout<<"det(v2, v1) = x’y - y’x"<<endl;
cout <<"det(v2, v1) = "<<v2.det(v1)<<endl;
return 0;
}
ZAKRANI / POO par C++ / 14-15 20
Solution (suite)