Introduction à la Programmation Orientée Objet et … a la POO.pdf1. Classes et encapsulation des...
Transcript of Introduction à la Programmation Orientée Objet et … a la POO.pdf1. Classes et encapsulation des...
Introduction à la Programmation Orientée
Objet et au C++
Christophe Collard
Concepts et exemples
Christophe Collard
Plan
Notions de programmation de base
Classes et Objets
Les fonctions amies
La surdéfinition d op ateu s
Les patrons de fonctions et de classes
La te h i ue de l h itage
Les espaces de nommage
Application - Code de calcul Simula+
Discussion
Notions de Programmation de Base
Christophe Collard
1. Les variables système
Type de donnée Signification Taille (en octets) Plage de valeurs acceptée
char Caractère 1 -128 à 127
unsigned char Caractère non signé 1 0 à 255
short int Entier court 2 -32 768 à 32 767
unsigned short int Entier court non signé 2 0 à 65 535
int Entier
unsigned int Entier non signé
long int Entier long 4 -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 4 0 à 4 294 967 295
float Flottant (réel) 4 -3.4*10-38 à 3.4*1038
double Flottant double 8 -1.7*10-308 à 1.7*10308
long double Flottant double long 10 -3.4*10-4932 à 3.4*104932
bool Booléen
2 (sur processeur 16 bits) 4 (sur processeur 32 bits)
-32 768 à 32 767 -2 147 483 648 à 2 147 483 647
2 (sur processeur 16 bits) 4 (sur processeur 32 bits)
0 à 65 535 0 à 4 294 967 295
Même taille que le type int, parfois 1 sur quelques
compilateurs
Prend deux valeurs : 'true' et 'false' mais une conversion implicite (valant 0 ou 1) est faite par le compilateur lorsque l'on affecte un entier (en réalité toute autre valeur que 0 est considérée comme égale à True).
1 octet = 8 bits
1 bit = 0 ou 1
Christophe Collard
2. Les boucles
But : effectuer plusieurs fois le e type d’op ratio s
Ex: sommer les 10 premiers entiers
Attention : en C++ il faut initialiser les variables, sinon une valeur aléatoire est attribuée
for (int i=0; i<10; i++)
type du compteur
initialisation du compteur
reste dans la boucle tant que cette condition est vérifiée
Incrémente le compteur de 1
Christophe Collard
Christophe Collard
3. Les fonctions
Fonction int
double float
INPUTS OUTPUT
But : accomplir une tâche
Atte tio : u e fo tio e peut e o e u u seul t pe
Fonction standard : float fctname (int, double)
Fonction sans argument : float fctname ()
Fonction sans valeur de retour : void fctname (int, double)
Remarque : une fonction bien programmée peut être lue sur 1 seul écran
Transmission de variable
Il existe 3 façons de transmettre des variables à une fonction :
- transmission par valeur
- transmission par adresse
- transmission par référence
adresse
valeur
adresse
valeur
n a
les valeurs de n et p sont dupliquées
on change les valeurs des copies
adresse
valeur
n a
les valeurs de n et p ne sont pas dupliquées
on change les valeurs des originaux
la simplicité de la notation de la transmission par valeur
le mécanisme de la transmission par adresse Christophe Collard
4. Surdéfinition de fonctions
une fonction avec un même nom possède plusieurs significations
sosie numero 1 : a = 5
sosie numero 2 : a = 2.5
Que se passe t il si x est de type float, long
dou le, …?
conversion du type par le compilateur Christophe Collard
7. Lallo atio d a i ue de oi e
l op ateu NEW se t à alloue de la oi e
l op ateu DELETE se t à li e de la oi e
Exemple 1
Exemple 2
Pou alloue l e ts d u « type » donné : new type [n]
new retourne un pointeur (type*) sur le 1er l e t d u ta leau
adresse
valeur
p
p[0]
adresse
valeur
adresse
valeur
adresse
valeur
adresse
valeur
p[4]
Lop ateu NEW
Christophe Collard
Lop ateu DELETE
li e la oi e allou e pa l op ateu NEW
o do e o e a gu e t l ad esse du poi teu fou ie pa e
syntaxe pour les éléments de type C++ standard
int* p;
p = new int [5];
delete p;
Atte tio le rôle de l’op rateur delete est tr s i porta t. Si on détruit un pointeur sans libérer correctement la mémoire, celle-ci ’est plus accessible et ne peut être réallouée
Stack overflow
Christophe Collard
Classes et Objets
Christophe Collard
Christophe Collard
Objectif
double a, b, s, p;
a= 5;
b = 7;
s = a + b;
p = a * b;
Variables standart du C++
Christophe Collard
Objectif
double a, b, s, p;
a= 5;
b = 7;
s = a + b;
p = a * b;
Variables standart du C++
D fi i de ou eau t pes de a ia les : e teu s, at i e, te seu s, …
double p;
vector u (4) , v(4), w(4);
u[1]=5; u[2]=3; u[3]=-1; u[4]=7;
v[1]=0.4; v[2]=7; v[3]=-1.2; v[4]=0.75
w = u + v;
p = u * v;
1. Classes et encapsulation des données
généralisation de la notion de type
e te sio des t pes C++ sta da d à de ou eau t pes d fi is pas l utilisateu
regroupe des données et des méthodes
données membres fonctions membres
Classe
On a séparé les données et fonctions membres en 2 catégories
public private Christophe Collard
Encapsulation
p i ate : do es et thodes o a essi les à l e t ieu de la lasse
seules les fonctions membres y ont accès
p ote ted : do es et thodes o a essi les à l e t ieu de la lasse
accès possible par les classes dérivées (cf plus tard)
pu li : do es et thodes a essi les à l e t ieu de la lasse
Remarques
pour modifier des données privées il faut passer via des méthodes publiques
En POO pure, les données sont encapsulées et leur accès ne peut se faire que par le
biais de méthodes
Christophe Collard
Définition des fonctions membres (méthodes)
x et y modifiables initialise méthode de point
le symbole :: est un opérateur de résolution de portée
l ide tifi ateu initialise est celui défini dans la classe point
Christophe Collard
Utilisation de la classe
Remarques
poi t est u ou eau t pe d fi i pa l utilisateu
a et b sont des instances de la classe point
a et b sont encore appelés des objets de type point
si au u des ots p i ate ou pu li appa aît da s la lasse, tout est o sid o e ta t p i ate => ie est a essi le
Christophe Collard
2. Constructeur et destructeur
atio d u ou el o jet
initialisation de ses données
allocation de mémoire
Processus automatisé
CONSTRUCTEUR
dest u tio d u o jet
libération de mémoire
Processus automatisé
DESTRUCTEUR
Fonctions membres appelées automatiquement à
ha ue atio / dest u tio d o jet
Christophe Collard
Exemple Résultat: affiche 10 valeurs aléatoires
Ch
rist
op
he
Co
lla
rd
3. E ploitatio d u e lasse
Disso ie l i pl e tatio d u e lasse de so utilisatio
Mettre dans un fichier séparé la classe et son implémentation
C atio de i lioth ues ue l o eg oupe pa th es
4. Propriétés des fonctions membres
Surdéfinition des fonctions membres
La surdéfinition de fonctions « ordinaires » e C++ s appli ue au fonctions membre d u e lasse, o p is au constructeur
Elle e peut s appli ue au dest u teu ui e eçoit au u a gu e t Christophe Collard
Exe
mp
le
Christophe Collard
Les o jets t a s is e a gu e t d u e fo tio e e
définir une méthode « coincide » dans la classe point pour comparer 2
objets de type point
Exemple
so appel s effe tue de la a i e sui a te
a.coincide (b)
ou par symétrie du problème
b.coincide (a)
Christophe Collard
- transmission par valeur
- transmission par adresse
- transmission par référence
Résultat
a et b 0 (false)
b et c 1 (true) Christophe Collard
Les fonctions amies
Christophe Collard
POO pure Encapsulation des données
données membres privées accessibles seulement par les
méthodes publiques de la classe
u e thode d u e aut e lasse doit passe ia les méthodes publiques de la classe pour accéder aux
données privées
problème dans certains cas
Exemple
On définit une classe vector et une classe matrix.
Produit matrice- e teu essite l a s au do es p i es des 2 lasses
Christophe Collard
Il e iste plusieu s situatio s d a iti
• fo tio i d pe da te a ie d u e lasse
• fo tio e e d u e lasse et a ie d u e aut e lasse
• fonction amie de plusieurs classes
• toutes les fo tio s e e d u e lasse, a ies d u e aut e lasse
Fo tio i d pe da te a ie d u e lasse
Une fonction amie se déclare avec le mot clé friend
Exemple
Christophe Collard
Résultat a et b coincident
a et c ne coincident pas Christophe Collard
La su d fi itio d op ateu s
Christophe Collard
Christophe Collard
On considère une classe vector 2D :
class vector
{ int x,y;
…
};
On définit 2 objets de type vector a et b
a
b
Peut on écrire comme pour un type standard C++ la somme a + b ?
Christophe Collard
Il faut surd fi ir l’op rateur + pour la classe
définir une fonction operator + au sein de la classe
utiliser le mot clé operator sui i de l op ateu à su d fi i
la fonction operator + peut être :
• soit une fonction membre de la classe
• soit une fonction indépendante amie de la classe
• soit une fonction indépendante de la classe
Afi de p ot ge les do es et d a l e le ode, o hoisit e g al de su d fi i l op ateu o e fo tio i d pe da te a ie de la lasse.
Christophe Collard
Surdéfinition d op ateu a e u e fo tio a ie
Résultat
coordonnees (1,2)
coordonnees (2,5)
coordonnees (3,7)
coordonnees (6,14)
Christophe Collard
Surdéfinition d op ateu a e u e fo tio e e
Résultat identique
Christophe Collard
Remarques
la fonction operator + est appelé de la manière suivante :
fontion indépendante : a + b operator + (a,b)
fontion membre : a + b a.operator + (b)
la fonction membre operator + fait apparaître une dissymétrie et
l o jet a e peut pas t e p ot g
Opérateurs et transmission par référence
Dans les deux exemples précédents, on utilise la transmission par valeur
Pour des objets de grande taille, il vaut mieux utiliser la transmission par
f e e. O peut alo s p ot ge les o jets t a s is a e o st
point operator + (const point& a, const point&b)
Le etou de l o jet poi t se fait obligatoirement par valeur
Christophe Collard
Surdéfinition de l op ateu [ ]
exemple de la classe vector
l op ateu [ ] pe et d a de au ième élément du vecteur
En informatique on commence à compter à partir de 0
En mathématiques on commence à compter à partir de 1
C est l op ateu [ ] ui fe a la o e sio
C++ i pose de d fi i l op ateu [ ] o e fonction membre
int& operator [ ] (int);
retour par référence o ligatoi e afi d utilise l op ateu pou affe te des valeurs
Christophe Collard
Les patrons de fonctions
Les patrons de classes
Christophe Collard
La surdéfinition de fonctions permet de donner un nom unique à plusieurs
fonctions réalisant un travail différent
La notion de patron est plus puissante et plus restrictive
Plus puissante
o it u e seule fois la d fi itio d u e fo tio pou ue le o pilateu puisse l adapte auto ati ue e t à i po te uel t pe
Plus restrictive
toutes les fonctions ainsi fabriquées ont la même définition et le même
algorithme
But
écrire une fonction qui soit valable quel que soit le type des arguments utilisés
Christophe Collard
Exemple
int min (int a, int b)
{ return (a < b) ? a : b;
}
float min (float a, float b)
{ return (a < b) ? a : b;
}
double min (double a, double b)
{ return (a < b) ? a : b;
}
long int min (long int a, long int b)
{ return (a < b) ? a : b;
}
et …
On écrit la même fonction pour tous les types existant en C++
est lo g, t s lo g, t s t s lo g
et en plus il faut le faire pour toutes les fonctions
ça multiplie les lignes de code et rend le code illisible
il faut compléter le code quand on définit ses propres classes
Christophe Collard
On résout ce problème en utilisant les patrons de fonctions
cette méthode est très puissante
Elle pe et de d fi i des thodes pou des t pes ui e iste t pas e o e
patron type
fonction
Résultat min (n,p) = 4
min (x,y) = 2.5
Christophe Collard
Surdéfinition des patrons
Remarque
o peut t a s ett e des l e ts de i po te uel t pe au fo tio s grâce aux patrons
les fo tio s su d fi ies doi e t a oi u o e d a gu e ts diff e t afi d ite les a igüit s
Christophe Collard
Les patrons de classes
Mise en évidence du problème
Comment stocker des points avec des coordonnées int, float, dou le, … ?
Utiliser des patrons de classe
Christophe Collard
Les patrons de patrons
Exemple d appli atio à la mécanique:
Loi de comportement : Σ = C :: E
Christophe Collard
Les patrons de patrons
Exemple d appli atio à la mécanique:
Loi de comportement : Σ = C :: E
Tenseurs d o d e 2 : Σ, E
Tenseur d o d e 4 : C (tenseur d lasti it )
C isotrope => 2 constantes d lasti it (Lamé)
Christophe Collard
Les patrons de patrons
Exemple d appli atio à la mécanique:
Loi de comportement : Σ = C :: E
Tenseurs d o d e 2 : Σ, E
Tenseur d o d e 4 : C (tenseur d lasti it )
C isotrope => 2 constantes d lasti it (Lamé)
Loi de
comportement
E
C Σ
INPUTS OUTPUT Fonction
Christophe Collard
Les patrons de patrons
Exemple d appli atio à la mécanique:
Loi de comportement : Σ = C :: E
Tenseurs d o d e 2 : Σ, E
Tenseur d o d e 4 : C (tenseur d lasti it )
C isotrope => 2 constantes d lasti it (Lamé)
Loi de
comportement
E
C Σ
INPUTS OUTPUT Fonction
C: utilisation d u pat o pou sto ke les constantes d lasti it
Christophe Collard
Loi de
comportement
E
C Σ
INPUTS OUTPUT Fonction
C: utilisation d u pat o pou sto ke les constantes d lasti it
C -> cubique (3 constantes élasticté)
Comment ne pas réécrire le code de la loi de comportement dans ce nouveau cas ?
Tenseurs d o d e 2 : Σ, E
Tenseur cubique : C (tenseur d lasti it )
Christophe Collard
Loi de
comportement
E
C Σ
INPUTS OUTPUT Fonction
C: utilisation d u pat o pou sto ke les constantes d lasti it
C -> cubique (3 constantes élasticté)
Comment ne pas réécrire le code de la loi de comportement dans ce nouveau cas ?
Tenseurs d o d e 2 : Σ, E
Tenseur cubique : C (tenseur d lasti it )
utiliser un patron pour C
C utilise déjà un patron pour stocker les constantes d lasti it
=> utilisation d u pat o de pat o
Christophe Collard
Avantage :
La loi de comportement reste valable même pour des objets non encore définis
Ex. On pourra définir plus tard un classe pour l lasti it orthotrope et utiliser
la même loi de comportement sans changer le code gérant cette loi.
Christophe Collard
La te h i ue de l h itage
Christophe Collard
Le o ept de l h itage ou de lasses d i es o stitue l u des fondements de la POO
Intérêt
classe de base
classe dérivée
propriétés de la classe
propriétés classe de base + nouvelles propriétés
Classe dérivée :
• nouvelle classe
• définie à partir de la classe de base
• hérite des propriétés de la classe de base
• ajoute de nouvelles propriétés à la classe de base
• ne modifie pas la classe de base
permet de développer de nouveaux outils en se basant sur les acquis de la
classe de base
Christophe Collard
Remarque
L h itage est pas li it à u seul i eau
• une classe dérivée peut devenir classe de base pour une autre classe
• plusieu s lasses peu e t t e d i es d u e e lasse
Christophe Collard
Mise e œu e de l h itage
Classe de base
Christophe Collard
Classe dérivée
On ajoute une information à cette classe : la couleur du point
Programme principal
Christophe Collard
Utilisatio des e es d u e lasse de ase da s u e lasse dérivée
Quand on appelle p.affiche() pour un objet de type pointcol, cette fonction
est pas d fi ie da s la lasse e fa t poi t ol
C est la fo tio affi he de la lasse pa e t poi t ui est appel e
C est la fo tio affi he de la lasse pa e t poi t ui est appel e
Christophe Collard
Utilisation
classe de base
dérivée 3 dérivée 2 dérivée 1 dérivée 4
pa tie o u e d u p o l e
solution 1 solution 2 solution 3 solution 4
gain de temps en programmation
pas de pénalité de temps pour les fonctions non utilisées dans la classe
dérivée, car non i lues lo s de l ditio de lie
pe te de te ps lo s d appel de fo tio s i i u es
Christophe Collard
Les espaces de nommage
Christophe Collard
zones de déclaration permettant de délimiter la recherche des noms des
identificateurs par le compilateur
Mot clé : namespace
But
regrouper les identificateurs logiquement pour éviter les conflits de nom
e t e plusieu s pa ties d u e p ojet
Remarque
par défaut, C++ utilise un espace de nommage (namespace std) de portée
globale dans lequel il doit y avoir aucun conflit de nom
D fi itio d u espa e de o age
Christophe Collard
Exemple de projet
Christophe Collard
simula+
MOL++
MateriOL++
MPISOL++
PMOL++
materials
tests
gui
doc
MOL++
MateriOL++
MPISOL++
PMOL++
materials
Christophe Collard
définition de la classe vector
Christophe Collard
Christophe Collard
Méthodes de la classe vector
Christophe Collard
Christophe Collard
Utilisation de la classe vector
Christophe Collard
Christophe Collard
Documentation en ligne & héritage
Christophe Collard
Références P se tatio t l ha gea le à l ad esse : http://www.lpmm.univ-metz.fr/collard/doc/introduction a la POO.pdf
Cours complet téléchargeable à l ad esse :
http://www.lpmm.univ-metz.fr/collard/doc/Programmation Orientee objet et
C++.v1.pdf