Vous êtes sur la page 1sur 60

Programmation Oriente Objet en C++

8me Partie: Objets et Classes

Fabio Hernandez
Fabio.Hernandez@in2p3.fr

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