Vous êtes sur la page 1sur 26

Le langage C++ et la programmation orientée

objets - séance 7 -

Prof. Karim Rhofir

ENSA Khouribga

Décembre 2021
Programmation Orientée Objets - Classes
Tableaux d’objets
En théorie, un tableau peut posséder des éléments de
n’importe quel type. Ainsi nous pouvons déclarer un tableau de
N objets d’une classe MaClasse par :
MaClasse tab[N] ;
Or, du fait qu’on ne peu déclarer un objet sans l’initialiser,
cette déclaration ne sera possible que si la classe MaClasse
admet un constructeur sans arguments (ou un constructeur
dont tous les arguments ont des valeurs par défaut).
Ces mêmes remarques s’appliquent pour les tableaux
dynamiques d’objets. Une déclaration de type :
MaClasse * adr = new MaClasse[N] ;
nécessite aussi un constructeur sans arguments.
On peut créer un objet dynamique, en appelant explicitement
le constructeur, par exemple :
Matrice * M = new Matrice(4,5) ;

Prof. Karim Rhofir C++ & POO


Programmation Orientée Objets - Classes

Méthodes constantes
Les objets, comme les autres types de C++, peuvent être
déclarées constants avec le mot clé const.
Dans ce cas, seules les fonctions membres déclarées et définies
avec le mot clé const peuvent être appelées par des objets
constants.
En effet, les méthodes déclarée comme constantes
permettent à l’utilisateur de cette méthode de savoir que cette
fonction ne modifiera pas les attributs de l’objet.
Ce sont aussi les seuls fonctions que l’on peut appeler sur des
objets constants.

Prof. Karim Rhofir C++ & POO


Programmation Orientée Objets - Classes

Méthodes constantes, Exemple :

class MaClasse { ... ...


public :...
type_a F (...);
// fct membre constante
type_b G (...) const ;
// fct avec argument constant
type_c K ( const MaClasse );
};

Remarque :
Une méthode constante peut être appelée sur un objet variable ou
constant.

Prof. Karim Rhofir C++ & POO


Programmation Orientée Objets - Classes
Méthodes constantes, Exemple :

// Declarations
MaClasse u ; // instance non constante
const MaClasse C ; // instance constante
// Appels
u . F (...); // OK
C . F (...) ; // Erreur : instance constante
u . G (...) ; // OK
C . G (...); // OK
MaClasse w ;
u . K ( C ); // OK
u . K ( w ); // OK
C . K ( w ); /* Erreur : instance constante
et fct non constante */

Prof. Karim Rhofir C++ & POO


Programmation Orientée Objets - Classes

Méthodes constantes, Exemple :


On adoptera donc la discipline de programmation suivante :
méthode d’accès aux données ou « accesseur » : il s’agit
des méthodes qui retournent ou affichent des attributs de
l’objet sans les modifier. Les accesseurs doivent être des
méthodes constantes.
méthode de modification des données ou «mutateur»
ou «modificateur» : il s’agit des méthodes qui modifient les
attributs de l’objet. Un modificateur ne doit donc pas être
appelé sur un objet constant. Par conséquent, un
modificateur ne doit surtout pas être déclaré comme une
méthode constante.

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Collaboration entre objets


les objets communiquent entre eux par des messages ( un objet
demande un service à un autre objet) pour résoudre un problème
final .
Association simple ,
Agrégation,
Composition,
Héritage (voir section héritage).

Remarque :
Les relations d’agrégation et de composition s’expriment en
insérant des variables membres dans une définition de classe.

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Collaboration entre objets : Unified Modelling Language (UML)

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation
Composition
La composition consiste à utiliser un objet comme attribut
d’un autre objet.
Par exemple, la classe Voiture contiendra quatre objets de la
classe Roue :

class Roue {
public : // les methodes ...
private : int diametre ;
...};
class Voiture {
private : string marque ;
Roue roueAvantGauche ;
Roue roueAvantDroite ;
Roue roueArriereGauche ;
Roue roueArriereDroite ;
...};
Prof. Karim Rhofir C++ & POO
Objet d’objets - Composition et Agrégation

Composition : Représentation UML

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Composition (suite)
Si un objet A est un attribut d’un objet B, le constructeur de
l’objet A sera appelé avant celui de l’objet B.
Ceci est logique :pour construire une voiture, il faut
d’abord construire ses composantes, comme le moteur
et les roues.
On dit que A et B sont reliés par une relation de composition,
c’est-à-dire que B est composé de A
Il s’agit d’une relation forte : si B est détruit, A disparaît aussi
C’est normal :Si on détruit une voiture les roues sont
détruites aussi.

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Initialisation d’un objet


Si une classe X se compose de sous-objets, alors la
construction d’un objet de type X provoque d’abord la
construction des sous-objets de X (et donc des sous-objets des
sous-objets de X, etc . . .).
Il est possible de définir quels sont les constructeurs à appeler
pour chacun des sous-objets, pour y arriver, il faut utiliser une
liste d’initialisation avec la notation « :» dans la définition
des constructeurs de X.

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Exemple : Initialisation d’un objet

Voiture :: Voiture ( string m , int d ):


roueAvantGauche ( d ) ,
roueAvantDroite ( d ) ,
roueArriereGauche ( d ) ,
roueArriereDroite ( d )
{ // ici on instancie les autres attributs de V
marque = m ;
}

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation
Agrégation
L’agrégation consiste essentiellement en une utilisation d’un
objet comme faisant partie d’un autre objet
Contrairement à la composition, où l’objet inclus disparaît si
l’objet englobant est détruit, dans une agrégation cet objet
ne disparaît pas lorsque l’objet englobant est détruit.
La manière habituelle d’implémenter l’agrégation en C++
est par l’utilisation de pointeurs. On peut aussi utiliser
l’agrégation par référence.

class Employe { ...


public : // les methodes
private : // les attributs };
class Company {...
private :
string nom ;
Employe * directeur ;
}; Prof. Karim Rhofir C++ & POO
Objet d’objets - Composition et Agrégation

Agrégation : Représentation UML

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation par pointeur


Pour l’exemple précédent le constructeur de la classe Company :
Company :: Company ( string n ) : nom ( n ) ,
directeur ( NULL )
// on n a pas encore designe le Directeur
{ }
Il nous faut donc une méthode pour désigner un Directeur :
Company :: set_directeur ( Employe * X ) {
directeur = X ; }

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation
Agrégation par pointeur
Pour qu’un objet de la classe Company soit réellement
intéressant, il nous faut une méthode pour lui associer un
employé comme directeur.
Ceci suppose qu’un objet dynamique de la classe Employe a
déjà été créé auparavant et que la méthode fera pointer son
pointeur sur cet objet.
Dans la fonction main() :
int main () {
...
Company ecole ( " ENSA " );
Employe * pers = new Employe ( " Ait ␣ Fdil " , ...);
ecole . set_directeur ( pers );
...
}

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation par pointeur


On pourrait aussi utiliser un paramètre supplémentaire dans le
constructeur :
Company :: Company ( string n , Employe * employe ) : n
directeur ( employe )
{ }
Dans la fonction main() :
int main () {
...
Company ecole ( " ENSA " , new Employe ( " Ait ␣ Fdil " , ...)
...
}

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation par référence


Lorsqu’on fait une agrégation par référence, la référence doit
absolument être initialisée lors de la création de l’objet.
En d’autres mots : l’objet nécessite la référence pour son
fonctionnement (différent de par pointeur).
L’objet doit donc exister déjà lorsqu’on crée une instance de la
classe englobante.

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation
Agrégation par référence

class Employe { ...


public : // les methodes
private : // les attributs };
class Company {...
private :
string nom ;
Employe & directeur ;
};
Company :: Company ( string n , Employe & employe ):
nom ( n ) , directeur ( employe ){ }
int main () {....
Employe employe ( " Ait " ,..);
Company ecole ( " ENSA " , employe );
/* l attribut directeur sera toujours
une reference a employe */ }

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation vs Composition

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation OU Composition ?

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation OU Composition ?

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation OU Composition ?

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation OU Composition ?

Prof. Karim Rhofir C++ & POO


Objet d’objets - Composition et Agrégation

Agrégation OU Composition ?

Prof. Karim Rhofir C++ & POO

Vous aimerez peut-être aussi