Vous êtes sur la page 1sur 17

Synthse Programmation Orient Objet

1. Definition :

Objet :
Contient des : - Donnes
- Mthodes : Procdure ou fonctions permettant de manipuler un objet.

Classe :
- Modle d'objet qui dcrit l'architecture des objets cres partir d'une classe.
- Une classe possde un nom significatif et unique dans l'espace de nom auquel elle appartient.
- Les donnes ports par les objets d'une classe sont contenus dans des champs ou proprits
- Une classe donne la description des proprits ou champs que l'on appelle aussi attributs ou
membres.
- Les methodes sont des fonctions ou procdures dfinies dans une classe et servent manipuler des
objets de la classe.
- Les methodes sont aussi des membres de la classe.
Une classe est constitu de membres : Proprits ou methodes.

Attention : Les classes dfinissent les proprit ou champs alors que les objets vont porter les
valeurs de ces proprits.

Classe UML Objet UML de la classe Personne

Nom de la Personne ::Personne


classe Nom Proprits Meyer
Prenom Alain
Age 32 Valeurs

Methodes

Espace de nom :
A l'interieur d'un espace de nom se trouve des fonctions, methodes, objets, classe ...
Exemple : std (espace de nom standart ou librairie standart)
Pour appeller l'objet cout de l'espace de nom standart :
std::cout << "Bonjour";
std::ofstream nomfichier("toto.txt");
nonfichier << "Bonjour";

On peut definir qu'on utilise par dfaut un espace de nom en particulier :


using namespace std
cout << "bonjour";

A partir d'une classe on peut crer des objets qui ont tous les memes proprits et les memes
methodes : On parle d'instanciation de classe ou d'instance :

En C++ :
(1) Personnes p1 Cration de l'objet p1 de type Personne sous la forme d'une
variable.
(2) Personnes *p = new Persone; On cr un ojetde Personnes avec l'oprateur
new et on stocke son adresse dans une variable pointeur ou variable de reference de type adresse
d'une Personne.

En Java :
(2) Personnes p = new Personnes On cr un objet de type de Personne et on stocke sa
rfrence dans la variable p.

En Php :
(2) $p = new Persnnes;

En JS :
(2) var p = new Personnes();

Represenation UML :
(1) (2)
P1 ::Personne P ::Personne *
Meyer
Alain
32
::Personne
Meyer
Alain
32

2. Membre dynamique et statique


Concerne les methodes et proprits.

Proprit dynamaique
Par dfaut une proprit est dynamaique : c--d les valeurs sont stocks dans les objet : 1 valeur par
objet.

Proprit statique
Pour une proprit statique la valeur est porte par la classe et non par les objets. Tous les objets
d'une mme classe peuvent accder aux proprits statiques et partagent les mmes valeurs.
En gnral les proprits statiques sont signals par un mot cl : static
Les proprits statiques sont comparables une variable globale appartenant un espace de nom
identique au nom de la classe.

Exemple d'une proprit statique pour compter des objets de type Personnes.
- On cr dans la classe Personne la proprit statique entire nbpersonne que l'on initialise 0.
- Dans le constructeur de la classe Personn on incrmente la proprit nbpersonnes chaque fois
que l'on cr une personne
- Dans le destructeur de la classe Personnes on decremente la propriet nbpersonnes chaque fois
que l'on detruit une personne.
personnes.h
class Personnes
{
public :
string nom;
string prenom;
int age;
static int nbpersonnes; Proprit statique
Personnes(); constructeur
~Personnes(); destructeur
}

personnes.cpp
#include personne.h Inclue la definition de la classe

int Personnes nbpersonnes = 0; Initialise la proprit statique

Personnes::Personnes() Constructeur
{
nbpersonnes++; Decremente nbpersonnes
}

Personnes::~Personnes() Destructeur
{
nbpersonnes--; Decremente nbpersonnes
}

Methodes dynamique :
Par dfaut une methode est dynamique, c'est dire qu'on l'appelle partir d'un objet pour le
manipuler.

Syntaxe :
En C++ : variable objet , Java, JS, CSharp
objet.methode( ... )
En C++ : avec un pointeur, Php :
objet -> methode( ... )

Remarque : En general objet est une reference une adresse d'un objet.

A l'interieur de la methode dynamique on accde directement aux valeurs de l'objet ayant servi
l'appel de celle i.

Syntaxe :
Java C++ :
proprit
Java, JS, CSharp
this.proprit
C++ :
this -> proprit
Php :
$this -> proprits
Exemple de la methode affiche() pour la classe Personnes.
C++ : p.affiche(); p->affiche();
void Personne::affiche()
{
cout << nom << " " << prenom;
}

Autre version C++ : Pointeur initialis au


void Personnes::affiche() moment de l'appel de
{ la methode qui
cout << this -> nom << this -> prenom; contient l'adresse de
} l'objet manipuler

Java : A l'interieur de la classe


class Personnes
{
... Variable contenant la
void affiche() rfrence de l'objet
{ manipul
system.out.println( nom );
system.out.println( this.prenom );
}

php :
class Personnes
{
....
function affiche()
{
echo( $this-> nom." ".$this->prenom;
}
}

JS:
Personnes.prototype =
{
affiche: function()
{
document.write( this.nom + " " + this.prenom);
}
}

Methode statique :
- Une methode statique est en fait une procedure ou fonction classique mais appartient une classe.
- Une mthode statique permet surtout d'accder aux proprits statique de la classe.
- Contraitemen aux methodes dynamiques, une methode statique ne necessite pas d'objet pour
l'appel en revanche on precise la nom de la classe.

Syntaxe d'appel :
C++, Php :
classe::methode( ... )
JS :
classe.prototype.methode( ... )

Membre publiques, privs, protgs :


Comme proprits et methodes le status publique, priv ou protg contiditionne partir d'ou on
peut acceder un membre.
On distingue 3 lieux d'accs :
1 - L'interieur d'une methode de la classe de l'objet manipul
2 - L'interieur d'une methode de la classe ou d'une classe parent de l'objet manipul
3 - L'exterieur de toute methode de la classe ou classe parents

Proprit : Accs : Lecture ou ecriture


Methode : Appel en execution

Membre priv (Notation UML - ): N'est accessible que de l'interieur d'une mthode de la classe de
l'objet : Cas 1
Membre protg (Notation UML # ): N'est accsible que de l'interieur d'une methode de la classe ou
d'une classe parent de l'objet : Cas 2 + 1
Membre publique (Notation UML + ): Est accessible de partout : Cas 2 + 3 + 1

On dfinit le statut priv, publique, ou protg par des mots cls du langage :

C++ : Par dfaut les membres sont privs :


private
Tous les membres
protected
qui suivent ont le
public
status associs
class Toto
{
membre 1
priv
membre 2
public
membre 3
publique
membre 4
private
membre 5 priv
}

Java : Par dfaut les membres sont publique


statut membre

public void affiche( );

Les statuts privs et protgs permettent de contrler l'accs aux membres.


Pour une proprit, cela permet de forcer les utilisateurs d'une classe utiliser des methodes
specifiques publiques pour lire ou ecrire dans un attribut priv. Les methodes sont appelles
"accesseur" dans le cas de lecture et "mutateur" dans le cas d'ecriture.

Exemple : de l'accs contrl l'age d'une personne :


la proprit age de la classe Personnes est priv ce qui force les utilisateurs a utiliser la methode
publique accesseur getAge() pour lire l'age d'une personne et la methode publique qui sera mutateur
: setAge( int ) pour mettre jour de faon contle l'age d'une personne.
class Personnes
{
public :
int getAge() { returnage; }
void setAge( int a )
{
if( a >= 0 ) age = a ;
}
private :
int age ;
};

Application : Personnages
nom
prenom
position
image

+static onloadImage()
#dessine

Methodes particulires/cycle de vie d'un objet :


Tout objet informatique possde un cycle de vie qui commence par une cration et se termine par
une destruction.
Lors de la vie d'un objet, celui ci prendra differents etats.
On le represente selon le Diagramme UML de cycle de vie d'un objet :

Debut Cration de l'objet

Etat 1

Succession de changement
Etat 2
de valeur de ses proprits

Etat 3

Fin Destruction de l'objet

Il existe 3 cas de figure concernant le debut et la fin d'un objet :


Cas 1 : Le plus courant :
- dbut : variable = new NomClasse
Exemple : Classe A
C++ : A* a = new A
Java : A a = new A
Php : $a = new A
- fin : delete variable
Exemple :
C++ : delete a
Php : delete $a
Cas 2 : Language sans pointeur (pointeur intelligent ou ramasse miette)
- debut : variable = new NomClasse
- fin : la destruction de l'objet se fait quand il n'existe plus de variable faisant reference
l'objet. A l'aide d'un compteur de reference cach dans chaque objet.
Exemple 1 : Java ou JS
A a = new A; L'objet est cr
.......
a = null; L'objet n'est plus rfrenc
et s'autodetruit
Exemple 2 : Java ou JS
A a,b;
a = new A
b=a;
.....
a = null;
b= null;

Remarque : Cette mthode coute des traitements en plus par l'utilisation d'un compteur de
reference qui va s'incrment ds qu'une variable pointe vers cette objet et se decrementer
ds qu'une variable ne pointe plus vers l'objet.

Risque de fuite mmoire :

A B

Un objet qui fait refrence un autre objet qui lui mme fait reference un ce mme objet.
Dans ce cas, mme si les variables faisant reference ces objets sont tous mise jour, les objets ne
seront pas dtruit.

Cas 3 :Cycle de vie associe une variable locale ou globale


Local : C++ Global : C++
{ Variable objet locale A a; dbut
A a; dbut {
.....
} fin L'objet est dtruit }
quand la variable fin A l'arrt de l'instance
locale est supprime du programme
Constructeur :
Methode particulire appelle automatiquement la cration d'un objet. Elle sert a initialiser les
attributs de celui-ci

C++, Java :
Methode sans type et ayant le mme nom que la classe. Supporte le polymorphisme.
class Personnes
{
Personne();
}
Php :
Ne supporte pas le polymorphisme.
.... construct(....)

Dans le cas du polymorphisme on peut definir plusieurs constructeurs diffrencis par leur chane
argumentaire.
class Personnes
{
Personne();
Personnes(string prenom, string nom);
}

On distingue 3 types de constructeurs :


- Constructeur par dfaut : il est sans arguments
- Constructeur de mise jour : il possde des arguments permettant de mettre jour les attributs de
l'objet.
- Constructeur de copie : Permet de crer un objet par copie (intelligente) d'un autre objet. Possde
un argument qui est une reference constante l'objet copi.

Remarque : Constructeur de copie


Analogie avec les nombres complexes (avec i = racine(-1) )
Analogie : avec les coordonnes d'un point :
En C++ :
class Point
{
public :
int x, y;
Point() { x=0; y = 0 }
Point( int x, int y ) { x=x; y=y }
}

Point a(100,200);
Point b = a;
Les valeurs des octets de a
b::Point sont copies dans ceux de b
0
0 b::Point
100
200
Exemple : Personnages avec un objets qui fait reference un autre objet

class Personnage
{
public :
String prenom;
Point * position; Rfrence un autre objet
Personnage(string prenom-, int x-, int y-)
{
prenom = prenom-;
position = new Point(x-, y-);
}
~Personnage()
{
if( position != 0) delete position;
}
Personnage()
{
position = new Point;
}
}

Cration d'un objet Personnage :


{
Personnage a("Toto", 10, 20);
Personnage b = a;
}

On a alors le cas de figure suivant :

a::Personnage b::Personnage

Toto Toto

Copie octet par octet qui va copier


dans position de l'objet P l'adresse de
position l'objet Point dj point par l'objet a

Point Point
10 0 L'objet Point cr lors de la creation de
20 0 b n'est pas point par b et est donc
perdu => fuite de mmoire

Mais lors de la fin d'execution du programme et la suppression des objets a et b (d'abord b puis a
dans l'ordre inverse de creation), l'objet b sera supprim ainsi que l'objet Point. Lorsque l'objet a
sera supprim le programme tentera de detruire l'objet Point qui aura dk t dtruit => Plantage.
Pour viter ce problme on va crer un constructeur de copie pour effectuer une copie intelligente
de a :
Personnage( const Personnage& p)
{
prenom = p.prenom
position = new Point(p.position->x, p.position->y);
}

Remarque :
On peut crer l'objet b, copie de a avec les 2 syntaxes suivantes :
Personnage b =a;
Personnage b(a);

Cas de figure o on passe par une variable de rfrence :

void titi( Personnage& p)


{

}
void main( ... )
{
Personnage a("toto", 10, 20);
titi( a );
}
Au sortir de la procdure titi
Destructeur
Methode execute automatiquement a la suppression d'un objet.
Permettre de liberer les ressources utilises par un objet.
Il n'y a qu'un seul destructeur par classe.

C++ : ~Nomdelaclasse()
Java : finalize()
Php : _ _ destruct()

<?php
$a = new Personnages("titi", 10, 20 )

Stock dans un tableau de session $_SESSION( ... ) =new Personnages("titi", 10, 20 )


L'objet est srialis la fin du script et dserialiser sur le prochain script la rcupration de l'objet
stock dans le tableau Session.

?> Le destructeur est execut la fin du stricpt

Polymorophisme de fonctions, de procdures et de mthodes :


La notion de polymorphisme autorise qu'une fonction, procdure ou mthode aient plusieurs formes
diffrencis par leur chane argumentaire.

Cas d'une procedure ou fonction


void maprocedure()
{

}
void maprocdure( int, float)
{
}
void maprocdure( string )
{
}
On a la mme chose pour les mthodes sauf pour le destructeur.

class Personnage
{
.....
void setPosition( int x, int y )
{
position -> x = x;
position -> y = y;
}
void setPosition( Point p )
{
position -> x = p.x; Ou egalement not :
position -> x = p.x; *position = p
}
}
Surcharge d'oprateur :
Un oprateur est un symbole amenant realiser une operation avec 1 ou plusieurs oprande, le tout
produisent un resultat.

1) Oprateur unaire (=1 seule oprande)


- Factorielle : 5 ! operateur
- Logaritheme : ln(5 )
- Racine carr : operande

Informatiquement un oprateur unaire est assimile une fonction ayant 1 argument, l'oprande ou
une methode sans argument.

Exemple :
fonction surchargeant l'operateur : Code quivalent :
int operator !( int a )
{ while( a == 0)
int r=1; {
while( a ) r * = a--; r=r*a;
return r ; a -- ;
} }

a-- => On prend la valeur de a et aprs on decremente a


--a => On decremente a et on prend le resultat

Operateur unaires acceptant la surcharge :


!, ++, - - , ( , )
Convertion : operateur de caste
int a = 5;
float b = ( float ) a; "Caster a en valeur rel pour le mettre
Operateur new, delete en b"
Tranformer une adresse en objet : *
Transformer un objet en adresse : &
Tilda : ~

2) Operateur binaire : 2 oprande


Assimilable a une fonction ayant 2 arguement : 2 operande ou ayant 1 argument corrspondant
l'oprande droite de l'operateur :
operande operateur operande

Operateur binaire acceptant la surcharge :


Arithematique :
+ - * / % += *= -= /=
Comparaison : (binaire)
== != <= >= < >
Logique (binaire)
&& ||
Operateur d'injection
<< >>
Operateur divers :
[ ] -> =
Operateur non surchargeable
.
Exemple : Surcharge de l'operateur =
class Personnage Personnage a("toto",10,20)
{ Personnage b;
..... ....
void operator = (Personnage& p); b = a; Signifie : b.=(a)
{ On appelle la methode b dans a
prenom = p.prenom
*position = *(p.position)
}
}

Respecte la forme canonique de Coplian.

Exemple : Surcharge de l'operateur d'addition de la classe point


"Vecteur"
P

x
N
M

0 y
OP = OM + ON

Point OM ( 2 , 4 )
Point ON (1 , 5)

Point OP ?
OP = OM + ON
OM.+(ON)

Exemple : Matrice
M 0 1 2 3
Class Matrice 4 x 4 4 5 6 7
{ 8 9 10 11
12 13 14 15
private :
double valeurs [ 16 ]; +
public : N
//Constructeur
Matrice4x4()
{
for( int i=a; i<16; valeurs[i] = 0.0;
} R

Pas besoin de destructeur car


il n'y a rien a desalou
(pointeur ...)
Matrice4x4 operator + ( Matrice 4 x 4 &

//Matrice resultat :

Surcharge de l'operateur [ ] :
double & operateur [ ] (int i ) Matrice4x4 M;
{ M(7)=12.2;
return valeur[ i ]; On recupere
} l'adresse pour
utiliser l'operateur [
] en lecture +ecr

Surcharge de l'operateur d'injection :


Void affiche ( ostream& out ) ofstream f ("titi.txt);
{
for( int i = 0; i <16; i++) out << valeur [ i ] << ' Matrice4x4 M;
'; M.affiche(f);
}

Surcharge :
ostream& operateur <<( ostream & out , Matrice4x4 M;
Matrice4x4& m) cout << M << 12;
{ f << M << ....
for( int i=0; i <16; i++) out << m[i] << ' ';
return out;
}

Surcharge de l'operateur de convertion (caste) :


Convertir une matrice en une valeur double (entier)
double operateur (double) ()
{ Matrice4x4 M;
double r = 0.0; double x;
for(int i =0; i < 16; i++) r + = valeur [ i ]; x=M;
return r;
}
Il existe 2 formes d'heritage :
- Heritage simple (il y a une seule classe mre pour une seule classe fille)
A partir d'une classe dite "mere" on cr une classe "fille" qui herite de tous ses membres
Un objet de la classe fille possde alors tous les attributs definis dans la classe fille + tous les
attributs de la classe mre et peut invoquer et excuter toutes les methodes definies dans les classes
filles et mre
- Heritage multiple
Une classe fille peut tre cree a partir de plusieurs classes mres.
Elle rcupre tous les membres de toutes les classes mres par heritage comme dans le cas d'un
heritage simple.
Un objet cr partir de C possde tous les attributs de A, B et C et peut invoquer toutes les
methodes de A, B et C.

<Mettre photo Iphone 17/10/2012 13:35>


- Heritage de plusieurs niveau
On peut cr partir d'une classe fille (classe elle mme, cr par heritage) une nouvelle classe fille.
La premiere joue alors le role de classe mere pour la seconde.

C p = new C <Mettre photo Iphone 17/10/2012 13:40>

Redefinition d'un attribut dans le cadre de l'heritage :


On peut dans une classe fille cr un attribut ayant le mme nom qu'un attribut existant dans une
classe mre. Ceci est une redefinition d'attribut .
/!\ Ceci n'est pas une surcharge /!\

<Mettre photo Iphone 17/10/2012 13:46>

Un objet cr partir de C, pour laquelle a1 et b1 sont redefinis contient l'union de tous les attributs
de A, B et C.
<Mettre photo Iphone 17/10/2012 13:50>

Redefinition d'un attribut dans le cadre de l'heritage :


Regle d'accs aux attributs
Quand on cherche a accder un attribut partir d'un objet, la recherche de l'attribut se fait toujours
en remontant d'heritage fille -> mre
Exemple :
Cp = new C;
p.c1 = 12; copie 12 dans l'attribut C::C1
p.a2 = 13; copie 13 dans l'attribut A::a2 (attribut a2 venant de A)
p.b1 = 14; copie 14 dans le premier attribut b1 trouv en remontant l'heritage de C -> B -> A
C::b1
p.B::b1=15; Copie 15 dans l'attribut b1 venant de B
p.a1=16; copie 16 dans le premier attribut a1 trouv en remontant l'heritage C -> B -> A
C::a1
p.a3=17; copie 17 dans le remier attribut a3 trouv en remontant l'heritage C -> B -> A
B::a3
p.A::a3=18; copie 18 dans A::a3

Redefinition d'attribut et heritage multiple :


C P = new C;
p.c1 = c2; 12 est copie dans C::c1
p.a2 = 13; Erreur de syntaxe li au fait que l'on ne sait pas dans quelle chercher l'attribut a1 car
il existe dans A et dans B
<Mettre photo Iphone 17/10/2012 14:10>
=> Dans ce cas de figure la seule solution pour lever l'ambiguit est de redefinir l'attribut a1 dans la
classe C.

<Mettre photo Iphone 17/10/2012 14:17>

D p = new D;
p.d1= 12; copie de 12 dans D::12 <Mettre photo Iphone 17/10/2012 14:17>
p.c1 = 13; copie de 13 dans C::c1
p.b1 = 14; copie de 14 dans B::b1
p.B::a1 = 15; copie de 15 dans B::a1
p.B::A::a1=15;
p.C::a1 = 16; copie de 16 dans C::a1
p.a1=17; Erreur de syntaxe car le compilateur ne sait quel attribut choisir entre B::a2 et C::a1

Dans ce cas les attributs B::a1 et C::a1 proviennent de part l'heritage B -> A et C -> B de la meme
classe A. Ils sont donc de mme type de valeur. Dans ce cas la notion d'heritage virtuel entre B et A
ou C et A peremet que le compilateur ne cr pas de doublon de l'attribut a1 dans D

Redfinition de methode dans le cas de l'heritage simple


On peut crer dans une classe fille une mthode ayant le mme prototype (mme nom, mme type
de valeur retourne et mme chaine argumentaire) qu'une mthode existant dans une classe mre.
On parle de redfinition de mthodes.

<Mettre photo Iphone 17/10/2012 14:34>

B p = new B;
p.ma1(); La methode execute est la premire methode ma1 trouve en remontant l'heritage de
la classe fille vers la classe mre => B::ma1

<Mettre photo Iphone 17/10/2012 14:42>

Redefinition de methode dans le cas de l'heritage multiple

<Mettre photo Iphone 17/10/2012 14:45>


<Mettre photo Iphone 17/10/2012 14:48>

Cas du stockage de la reference ou de l'adresse d'un objet dans une variable qui n'est pas du mme
type que l'objet :
B b = new B;
E e;
A a;
a.ma1(); Erreur : On a declar la variable a mais elle ne contient pas d'objet
Il faut initialiser la variable avec un objet.

<Mettre photo Iphone 17/10/2012 14:57>

B b = new B;
a.ma1();
E e;
A a;
e = b; Interdit : Copier la reference d'un objet de type B dans une variable de type E. Un
objet de type B n'est pas un objet de type E.
a = b; Possible : de part l'heritage B -> A un objet de type B est aussi un ibjet de type A
<Mettre photo Iphone 17/10/2012 15:02>

<Mettre photo Iphone 18/10/2012 09:10>


<Mettre photo Iphone 18/10/2012 09:20>
<Mettre photo Iphone 18/10/2012 09:30>

Le modle MVC :
<Mettre photo Iphone 18/10/2012 10:00>

Les listes chaines :


<Mettre photo Iphone 20/12/2012 13:29>