Programmation Oriente Objet en C++
8me Partie: Objets et Classes
Fabio Hernandez
[email protected]
Vue d'Ensemble
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Notions de base
Types, variables, oprateurs
Contrle d'excution
Fonctions
Mmoire dynamique
Qualit du logiciel
Evolution du modle objet
Objets et classes
Fonctions membres
Classes gnriques
Hritage
Polymorphisme
Hritage multiple
Entre/sortie
POO en C++: Objets et Classes
197
1997-2003 Fabio HERNANDEZ
Table des Matires
}
}
}
Nature d'un Objet
Nature d'une Classe
Exemple: une classe simple
abstraction
dfinition de l'interface
utilisation
implmentation
modification
fonction membres
contrle d'accs
initialisation/destruction
Rsum
POO en C++: Objets et Classes
198
1997-2003 Fabio HERNANDEZ
Nature d'un Objet
}
Un objet reprsente une entit individuelle et identifiable,
relle ou abstraite, avec un rle bien dfini dans le domaine du
problme
Exemple: dans une usine de fabrication d'automobiles, on peut
identifier des objets tels
moteur
chssis
volant
systme lectrique
processus de montage
Des objets peuvent tre tangibles, mais peuvent ne pas avoir
une frontire physique trs bien dfinie (rivire, des nuages, ...)
POO en C++: Objets et Classes
199
1997-2003 Fabio HERNANDEZ
Nature d'un Objet (suite)
}
Caractristiques d'un objet
Etat
Comportement
Identit
Etat
un attribut est une caractristique, qualit ou trait intrinsque qui
contribue faire unique un objet
l'tat d'un objet comprend les proprits statiques (attributs) et les
valeurs de ces attributs
les valeurs des attributs peuvent tre statiques ou dynamiques
du fait d'avoir un tat, un objet occupe un espace dans le monde
physique et dans la mmoire de l'ordinateur
exemple: les attributs de l'objet point en deux dimensions sont les
coordonnes x et y
POO en C++: Objets et Classes
200
1997-2003 Fabio HERNANDEZ
Nature d'un Objet (suite)
}
Comportement
faon d'agir et de ragir d'un objet comme consquence des
changements d'tat et des oprations effectues sur lui
reprsente l'activit de l'objet vue de l'extrieur
si on regarde un objet comme un serveur, son comportement est
l'ensemble des services offerts par lui ses clients
exemple: un point peut tre dplac, tourn autour d'un autre point, etc.
le comportement dpend de l'tat de l'objet et de l'opration
effectue sur lui
l'tat d'un objet reprsente le rsultat cumul de son comportement
Identit
proprit d'un objet qui permet de le distinguer des autres objets de la
mme classe
POO en C++: Objets et Classes
201
1997-2003 Fabio HERNANDEZ
Nature d'une Classe
}
}
}
}
Les notions de classe et d objet sont troitement lies
Une classe est un ensemble d'objets qui partagent une
structure et un comportement communs
Une classe est seulement une abstraction
Un objet est une instance (entit concrte) d'une classe en
temps d'excution
On peut voir la classe comme un moule pour la fabrication
d'objets
Les objets fabriqus avec le mme moule partagent structure
et comportement
POO en C++: Objets et Classes
202
1997-2003 Fabio HERNANDEZ
Nature d'une Classe (suite)
}
Deux vues d'une classe
interface
implmentation
Interface
vue externe abstraite d'une classe
liste de services offerts par les instances de la classe (contrat)
une opration non spcifie dans l'interface d'une classe ne peut tre
applique sur une instance (objet) de cette classe
cache la structure interne de la classe (encapsulation)
rponse la question quoi
contenue dans un fichier d'entte (.h)
POO en C++: Objets et Classes
203
1997-2003 Fabio HERNANDEZ
Nature d'une Classe (suite)
}
Implmentation
vue interne d'une classe
comprend les secrets (dtails internes) de son comportement
l'implmentation d'une classe est constitue de l'implmentation de
chacune des oprations dfinies dans son interface
rponse la question comment
contenue dans un fichier d'implmentation (.cpp)
POO en C++: Objets et Classes
204
1997-2003 Fabio HERNANDEZ
Exemple: classe Point
}
Ecriture en C++ d'une classe (interface et implmentation)
reprsentant la notion d'un point en deux dimensions
POO en C++: Objets et Classes
205
1997-2003 Fabio HERNANDEZ
Classe Point: abstraction
}
Quels sont les attributs d'un point qui nous intressent?
la coordonne x
la coordonne y
la distance l'origine ()
l'angle par rapport l'horizontale ()
Quelles sont les oprations applicables sur un point qui nous
intressent ?
translation
rotation autour de l'origine
...
POO en C++: Objets et Classes
206
1997-2003 Fabio HERNANDEZ
Classe Point : interface
}
}
Dfinition (incomplte) de l'interface de la classe Point
Fichier Point.h
class Point {
public:
float getX();
float getY();
float rho();
float theta();
// Not yet finished !!!
// returns the x coordinate
// returns the y coordinate
// returns the distance to the origin
// returns the angle to the
// horizontal axis
void translate(float horizontal, float vertical);
void rotate(float angle);
};
POO en C++: Objets et Classes
207
1997-2003 Fabio HERNANDEZ
Classe Point : interface (suite)
}
}
}
getX, getY, rho, theta, translate et rotate sont des
mthodes (services) fournies par toutes les instances de la
classe Point
getX, getY, rho et theta retournent une valeur de type
float
translate et rotate ne retournent rien
translate et rotate ont besoin d'information supplmentaire
pour accomplir leur mission
un dplacement horizontal et vertical, dans le cas de translate
un angle, dans le cas de rotate
Y a-t-il des similarits avec la dclaration des fonctions,
tudie prcdemment?
Le mot cl public sert contrler l'accs aux mthodes de la
classe. Plus d'informations ce propos plus tard.
POO en C++: Objets et Classes
208
1997-2003 Fabio HERNANDEZ
Classe Point : utilisation
}
Comment utiliser les services offerts par les objets de la classe
Point?
il faut dfinir un objet de cette classe et ensuite...
lui envoyer un message indiquant le service que l'on demande
La dfinition de l'objet est faite de la mme faon que la
dfinition des objets des types primitifs
int count;
Point p;
Pour envoyer le message indiquant le service demand on utilise
la notation
service demand
objet destinataire
du message
POO en C++: Objets et Classes
p.rotate(45.0);
argument(s) du service
209
1997-2003 Fabio HERNANDEZ
Classe Point : utilisation (suite)
}
Utilisation d'objets de la classe Point (fichier main.cpp)
#include <iostream>
#include "Point.h"
void main()
{
// Instantiate a Point object
Point p;
inclusion du fichier
qui contient
l'interface
de la classe
// Show its coordinates
cout << "p is ("
<< p.getX() << ',' << p.getY()
<< ')' << endl;
POO en C++: Objets et Classes
210
1997-2003 Fabio HERNANDEZ
Classe Point : utilisation (suite)
// Show its angle
cout << "The angle theta of p is: " << p.theta()
<< endl;
// Let's translate p
p.translate(10.0, 20.0);
// Show again its coordinates, after the translation
cout << "p is now (" << p.getX() << ',' << p.getY()
<< ')'<< endl;
} // main
POO en C++: Objets et Classes
211
1997-2003 Fabio HERNANDEZ
Classe Point : utilisation (suite)
}
Lors de l'excution de ce programme, il devrait s'afficher
l'cran
p is (0.0,0.0)
The angle theta of p is: 0.0
p is now (10.0,20.0)
POO en C++: Objets et Classes
212
1997-2003 Fabio HERNANDEZ
Classe Point : utilisation (suite)
}
La dfinition de pointeurs aux objets d'une classe se fait de la
mme faon que celle des pointeurs aux objets des types
primitifs
int* anIntPointer;
Point* aPointPointer;
L'allocation de mmoire se fait l'aide de l'oprateur new
anIntPointer = new int;
aPointPointer = new Point;
L'envoi de messages, l'aide de l'oprateur ->
aPointPointer->translate(10.0, 20.0);
La dsallocation, l'aide de l'oprateur delete
delete aPointPointer;
POO en C++: Objets et Classes
213
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation
}
}
}
}
}
}
Comment implmenter chacun des services spcifis dans le
contrat (interface de la classe) ?
Tout d'abord, il faut dterminer les attributs qui constitueront
l'tat d'un point, dans la perspective de notre abstraction
Nous allons reprsenter un point comme un couple (x,y)
Chacune des coordonnes est une valeur de type float
Les attributs reprsentant les coordonnes x et y s'appelleront
x_ et y_ respectivement
Le caractre soulign de x_ et y_ est une convention de style
Les attributs x_ et y_ sont appels les donnes membres, par
opposition aux fonctions membres ( getX, getY, rho, theta,
translate, rotate) de la classe
POO en C++: Objets et Classes
214
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
class Point {
public:
float
float
float
float
// Not yet finished !!!
getX();
getY();
rho();
theta();
// returns the x coordinate
// returns the y coordinate
// returns the distance to the origin
// returns the angle to the
// horizontal axis
void translate(float horizontal, float vertical);
void rotate(float angle);
float x_;
float y_;
// x coordinate
// y coordinate
};
POO en C++: Objets et Classes
215
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
Notation quasi UML (Unified Modeling Language)
http://www.rational.com/uml
Nom
Nomde
delalaclasse
classe
Point
x_: float
y_: float
Attributs
Attributs
getX: float
getY: float
rho: float
theta: float
translate: void
rotate: void
POO en C++: Objets et Classes
Oprations
Oprations
216
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
En temps d'excution
// Create a point object
Point p1;
p1: Point
x_ = 0.0
y_ = 0.0
// Create another point object
Point p2;
p1: Point
x_ = 0.0
y_ = 0.0
POO en C++: Objets et Classes
p2: Point
x_ = 0.0
y_ = 0.0
217
Deux
Deuxinstances
instances
diffrentes
diffrentesde
delalamme
mme
classe
classePoint
Point,,avec
avecles
les
mmes
mmesvaleurs
valeursdans
dansleurs
leurs
attributs
attributs
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
En temps d'excution (suite)
// Translate p1
p1.translate(34.5, 18.8);
p1: Point
x_ = 34.5
y_ = 18.8
p2: Point
x_ = 0.0
y_ = 0.0
// Now translate p2
p2.translate(-10.0, 20.0);
p1: Point
p2: Point
x_ = 34.5
y_ = 18.8
x_ = -10.0
y_ = 20.0
POO en C++: Objets et Classes
218
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
Et si on utilise des pointeurs
// Create a point pointer
Point* p1 = new Point;
p1
:Point
x_ = 0.0
y_ = 0.0
// Create another pointer
Point* p2 = p1;
p1
p2
:Point
x_ = 0.0
y_ = 0.0
POO en C++: Objets et Classes
219
Une
Uneseule
seuleinstance
instance
de
delalamme
mmeclasse
classe
Point
Point,,rfrence
rfrence
par
pardeux
deuxpointeurs
pointeurs
diffrents
diffrents
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
Et si on utilise des pointeurs (suite)
// Translate the point pointed to by p1
p1->translate(34.5, 18.8);
p1
p2
:Point
x_ = 34.5
y_ = 18.8
// Now translate the point pointed to by p2
p2->translate(-10.0, 20.0);
p1
p2
:Point
x_ = 24.5
y_ = 38.8
POO en C++: Objets et Classes
220
1997-2003 Fabio HERNANDEZ
Classe Point : implmentation (suite)
}
Nous pouvons maintenant implmenter chacune des fonctions
membres de la classe
L'implmentation de ces fonctions sera crite dans un fichier
de type .cpp
Nous crons ainsi le fichier Point.cpp
POO en C++: Objets et Classes
221
1997-2003 Fabio HERNANDEZ
Fichier Point.cpp
///////////////////////////////////////////////////////
// File: Point.cpp
// Description: implementation of the Point class
///////////////////////////////////////////////////////
#include "Point.h"
#include <math.h>
// we need sin(), cos(), sqrt()
float Point::getX()
{
return x_;
}
float Point::getY()
{
return y_;
}
POO en C++: Objets et Classes
222
1997-2003 Fabio HERNANDEZ
Fichier Point.cpp (suite)
float Point::rho()
{
return sqrt(x_*x_ + y_*y_);
}
float Point::theta()
{
return atan2(y_, x_);
}
POO en C++: Objets et Classes
223
1997-2003 Fabio HERNANDEZ
Fichier Point.cpp (suite)
void Point::translate(float horizontal, float vertical)
{
x_ += horizontal;
y_ += vertical;
}
void Point::rotate(float angle)
{
float currentRho = rho();
float newTheta = theta() + angle;
x_ = currentRho * cos(newTheta);
y_ = currentRho * sin(newTheta);
Une
Unefonction
fonction
membre
membrepeut
peuten
en
appeler
appelerd'autres
d'autres
de
delalamme
mme
classe
classe
POO en C++: Objets et Classes
224
1997-2003 Fabio HERNANDEZ
Contrle d'accs
}
Le mot cl public dans l'interface de la classe Point tablit
pour un service (fonction membre), qu'il est utilisable par n'importe quel
objet client
pour un attribut (donne membre), qu'il est accessible (y compris pour le
modifier) depuis n'importe quel autre objet
En particulier, nous pourrions faire
// Instantiate a Point object
Point p;
// WARNING: its x attribute can be modified!!!!
p.x_ = 47.0;
POO en C++: Objets et Classes
225
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
}
L'accs public n'est pas souhaitable principalement pour les
attributs de la classe
Les donnes membres d'une classe font partie des secrets de
l'implmentation et ne devraient donc pas tre accessibles en
dehors de l'objet
Nous devrions pouvoir encapsuler ces attributs de faon ce
que les clients de la classe ne puissent pas y accder
directement
C++ offre plusieurs niveaux pour contrler l'accs aux
fonctions/donnes membres
public
protg
priv
POO en C++: Objets et Classes
226
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
}
Accs public
Accs protg
Mot cl public
Les fonctions/donnes membres sont accessibles par tous les objets
Mot cl protected
Etroitement li avec les mcanismes d'hritage
L'accs est limit aux classes de la hirarchie
Plus de dtails quand nous tudierons l'hritage
Accs priv
Mot cl private
Les fonctions/donnes membres sont accessibles uniquement par les
fonctions qui implmentent les services offerts par la classe, et pas de
l'extrieur
POO en C++: Objets et Classes
227
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
}
Il est ncessaire de modifier l'interface de la classe Point
class Point {
public:
float getX();
float getY();
float rho();
float theta();
// Not yet finished !!!
// returns the x coordinate
// returns the y coordinate
// returns the distance to the origin
// returns the angle to the
// horizontal axis
void translate(float horizontal, float vertical);
void rotate(float angle);
private:
float x_;
float y_;
};
POO en C++: Objets et Classes
// x coordinate
// y coordinate
228
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
}
Il est maintenant impossible d'accder de l'extrieur aux
attributs de la classe Point directement
// Instantiate a Point object
Point p;
// Let's try to access the x_ attribute
cout << "p.x_ = "
<< p.x_ << endl; // Compilation ERROR:
// the x_ attribute is
// private!!!
POO en C++: Objets et Classes
229
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
}
Notez qu'il n'est pas ncessaire de modifier l'implmentation
des fonctions membres de la classe (rotate, translate,
theta, rho, getX et getY)
Toute fonction membre d'une classe peut accder tous les
attributs et toute autre fonction membre, y compris ceux
privs, de la mme classe
C'est un mcanisme trs puissant de la technologie objet. Il
permet de
sparer compltement interface et implmentation
cacher les dtails (secrets) de l'implmentation aux clients
(encapsulation)
Rsultat: les modifications faites l'implmentation de la
classe n'ont aucun impact chez les clients
POO en C++: Objets et Classes
230
1997-2003 Fabio HERNANDEZ
Contrle d'accs (suite)
sla
t
Encapsulation
Encapsulation::pour
pour
accder
accderaux
auxdonnes
donnes
membres
membresde
delalaclasse,
classe,ilil
faut
faututiliser
utiliserles
lesservices
services
fournis
fournispar
parlalaclasse
classe
rh
X
get
x_
y_
an
t
o
r
e
t
a
tr
get
Y
ta
e
h
Classe Point
POO en C++: Objets et Classes
231
1997-2003 Fabio HERNANDEZ
Fonctions Membres
}
On peut diffrencier les fonctions membres d'une classe par
rapport leur mission
gestion (comparaison, cration/initialisation, destruction, copie, ...)
modification de l'tat
consultation de l'tat (attributs) de l'objet
fonctions d'aide
itration, pour les classes d'objets qui sont des conteneurs d'autres
objets
Dans notre implmentation de la classe Point
getX(), getY(), rho() et theta() servent consulter l'tat de
l'objet
translate() et rotate() modifient l'tat de l'objet
il n'y a pas (encore) des fonctions membres de gestion ni d'aide
POO en C++: Objets et Classes
232
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
}
Si le contraire n'est pas explicitement spcifi, en C++ les
fonctions membres sont des modificateurs potentiels de l'tat
de l'objet
En consquence, il est impossible de demander un service un
objet dfini constant, si la fonction membre qui implmente le
service ne l'est pas
// Define a constant point
const Point origin;
// Retrieve the theta angle
float angle = origin.theta();
POO en C++: Objets et Classes
233
//
//
//
//
Compilation ERROR:
'origin' is constant
and Point::theta()
is not
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
d'aprs l'interface de la classe, la fonction membre theta() est un
modificateur potentiel de l'tat de l'objet origin
ceci est incompatible avec le fait que origin est constant
Il faut modifier lgrement l'interface de la classe Point
pour informer le compilateur que Point::theta() ne modifie
pas l'tat des objets de sa classe
Il suffit d'ajouter le mot cl const la dclaration de la
fonction membre
POO en C++: Objets et Classes
234
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
}
Modification de l'interface de la classe Point (fichier
Point.h)
class Point {
public:
// Not yet finished !!!
// Modifiers
void translate(float horizontal, float vertical);
void rotate(float angle);
// Selectors
float getX() const;
float getY() const;
POO en C++: Objets et Classes
// x coordinate
// y coordinate
235
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
float rho() const;
// distance to the origin
float theta() const; // angle to the
// horizontal axis
private:
// Data members
float x_;
// Cartesian coordinates
float y_;
};
POO en C++: Objets et Classes
236
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
}
Modification de l'implmentation de la classe Point (fichier
Point.cpp), pour reflter les changements dans l'interface
///////////////////////////////////////////////////////
// File: Point.cpp
// Description: implementation of the Point class
///////////////////////////////////////////////////////
#include "Point.h"
#include <math.h>
POO en C++: Objets et Classes
// we need sin(), cos(), sqrt()
237
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
///////////////////////////////////////////////////////
// Modifiers
void Point::translate(float horizontal, float vertical)
{
x_ += horizontal;
y_ += vertical;
}
void Point::rotate(float angle)
{
float currentRho = rho();
float newTheta = theta() + angle;
x_ = currentRho * cos(newTheta);
y_ = currentRho * sin(newTheta);
}
POO en C++: Objets et Classes
238
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
///////////////////////////////////////////////////////
// Selectors
float Point::getX() const
{
return x_;
}
float Point::getY() const
{
return y_;
}
POO en C++: Objets et Classes
239
1997-2003 Fabio HERNANDEZ
Fonctions Membres (suite)
float Point::rho() const
{
return sqrt(x_*x_ + y_*y_);
}
float Point::theta() const
{
return atan2(y_, x_);
}
POO en C++: Objets et Classes
240
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation
}
Comme pour les types primitifs, lors de la dfinition d'un objet
le compilateur doit
rserver une quantit de mmoire suffisante pour stocker l'objet
donner une valeur initiale l'objet
Initialiser un objet compos de plusieurs donnes membres
(comme un objet de la classe Point) se traduit par donner une
valeur initiale chacune d'elles
Le compilateur fournit une fonction d'initialisation par dfaut
pour chaque classe
Appele implicitement lors
de la dfinition d'un objet
Point p;
POO en C++: Objets et Classes
241
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
}
}
Dans notre exemple de classe Point, cette fonction donne une
valeur initiale aux atributs x_ et y_ (probablement zro)
C++ offre au programmeur la possibilit de dfinir sa propre
mthode d'initialisation
Cette mthode d'initialisation est appele le constructeur
Un constructeur est une fonction membre comme les autres,
avec deux caractristiques particulires
de l'allocation d'un objet via l'oprateur new
Point* pointPointer = new Point;
il porte le mme nom que la classe
il n'a pas un type de valeur de retour, mme pas void
Ajoutons le constructeur la classe Point
POO en C++: Objets et Classes
242
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
class Point {
public:
// Constructor
Point();
// Modifiers
...
// Selectors
...
private:
// Data members
...
};
POO en C++: Objets et Classes
243
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
}
Le fichier Point.cpp doit tre modifi pour ajouter
l'implmentation du constructeur
///////////////////////////////////////////////////////
// Constructor
Point::Point()
{
x_ = 0.0;
y_ = 0.0;
}
POO en C++: Objets et Classes
244
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
}
}
}
C++ permet de dfinir plusieurs constructeurs diffrents pour
la mme classe
Leur signatures doivent tre diffrentes
Nous pourrions ajouter notre classe Point un constructeur
afin de pouvoir crer un objet et spcifier les valeurs initiales
des coordones
l'implmentation de la classe Point ne nous permet pas de faire cela
directement, mais en deux tapes
// Create the point object
Point p; // p is (0.0, 0.0)
// Translate it
p.translate(45.0, 80.0);
POO en C++: Objets et Classes
245
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
class Point {
public:
// Constructors
Point();
Point(float initialX, float initialY);
// Modifiers
...
// Selectors
...
private:
// Data members
...
};
POO en C++: Objets et Classes
246
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
}
La classe Point offre maintenant deux possibilits de cration
d'objets
// Create a point at (45.0, 80.0)
Point p(45.0, 80.0); // calls Point::Point(float,float)
// Create a point at (0.0, 0.0)
Point origin;
// calls Point::Point()
// Create a point at (5.0, 10.0) in the heap
Point* pointPointer = new Point(5.0, 10.0);
POO en C++: Objets et Classes
247
1997-2003 Fabio HERNANDEZ
Fonctions Membres d'Initialisation (suite)
}
Le fichier Point.cpp contiendra l'implmentation du nouveau
constructeur
///////////////////////////////////////////////////////
// Constructors
Point::Point()
{
x_ = 0.0;
y_ = 0.0;
}
// Default constructor
Point::Point(float initialX, float initialY)
{
x_ = initialX;
y_ = initialY;
}
POO en C++: Objets et Classes
248
1997-2003 Fabio HERNANDEZ
Fonction Membre de Destruction
}
La fonction membre de destruction est appele quand
un objet cr dans la pile d'excution sort du contexte (fin de bloc ou
fin de fonction par exemple)
un objet cr dans le tas est explicitement dtruit avec l'oprateur
delete
Comme pour les constructeurs, le compilateur fournit un
destructeur par dfaut
Le destructeur est utile pour librer les ressources acquis lors
de la cration/modification de l'objet
libration de mmoire
fermeture des fichiers
libration de verrous
...
POO en C++: Objets et Classes
249
1997-2003 Fabio HERNANDEZ
Fonction Membre de Destruction (suite)
}
}
Une classe ne peut avoir qu'un seul destructeur
Le destructeur porte le nom de la classe prcd du caractre
~ (tilda)
Comme pour les constructeurs, le destructeur n'a pas de type
de valeur retour
A la diffrence des constructeurs, le destructeur n'accepte
pas de paramtres
POO en C++: Objets et Classes
250
1997-2003 Fabio HERNANDEZ
Fonction Membre de Destruction (suite)
class Point {
public:
// Constructors/Destructor
Point();
Point(float initialX, float initialY);
~Point();
// Modifiers
...
// Selectors
...
private:
// Data members
...
};
POO en C++: Objets et Classes
251
1997-2003 Fabio HERNANDEZ
Fonction Membre de Destruction (suite)
}
Le fichier Point.cpp contiendra l'implmentation du
destructeur
///////////////////////////////////////////////////////
// Destructor
Point::~Point()
{
// Nothing to be done
}
POO en C++: Objets et Classes
252
1997-2003 Fabio HERNANDEZ
Organisation des Fichiers Source
Point.h
Point.cpp
#include
#include <math.h>
<math.h>
#include
"Point.h"
#include "Point.h"
#if
#if !defined(POINT_H)
!defined(POINT_H)
#define
#define POINT_H
POINT_H
Point::Point()
Point::Point()
{{
x_
x_ == 0.0;
0.0;
y_
=
0.0;
y_ = 0.0;
}}
class
class Point
Point {{
public:
public:
Point();
Point();
~Point();
~Point();
private:
private:
float
float x_;
x_;
float
float y_;
y_;
};
};
Point::~Point()
Point::~Point()
{{
}}
Point::getX()
Point::getX()
{{
return
return x_;
x_;
}}
#endif
#endif //
// POINT_H
POINT_H
POO en C++: Objets et Classes
253
1997-2003 Fabio HERNANDEZ
Exercices
}
Ajouter une fonction membre pour comparer deux objets de la
classe Point et dterminer s'ils sont identiques
Ajouter une fonction membre pour copier un objet de la classe
Point dans un autre
Ajouter un troisime constructeur (appel constructeur de
copie) pour construire un objet de la classe Point partir d'un
objet de la classe Point pass comme argument
Ajouter une fonction membre pour modifier les valeurs des
coordonnes (x et/ou y) d'un objet de la classe Point
Quelles modifications faut-il faire si l'on veut reprsenter un
Point en coordonnes polaires et non pas cartsiennes et ce
sans impacter les clients de la classe?
POO en C++: Objets et Classes
254
1997-2003 Fabio HERNANDEZ
Rsum
}
}
}
}
La classe est un moule pour construire des entits qui partagent
structure et comportement
L'interface et l'implmentation d'une classe sont clairement
identifies
L'interface d'une classe est un contrat vis--vis des clients
L'objet est la structure dynamique d'un programme
Les objets collaborent (changent des messages) pour rsoudre
le problme en question
Un objet est constitu d'attributs (structure) et de fonctions
membres (comportement)
L'accs aux donnes et aux fonctions membres peut tre
contrl et vrifi en temps de compilation
POO en C++: Objets et Classes
255
1997-2003 Fabio HERNANDEZ