• Aucun résultat trouvé

Les concepts de base de la POO Application en C++

N/A
N/A
Protected

Academic year: 2022

Partager "Les concepts de base de la POO Application en C++"

Copied!
7
0
0

Texte intégral

(1)

1

Les concepts de base de la POO Application en C++

„

Encapsulation

„

Héritage

„

Polymorphisme

2

Les concepts de base de la POO La notion d'objets

„

Intuitivement, un objet est une représentation d'une entité du monde réel.

„ une voiture, une maison, une personne, …

„

Un objet est caractérisé par un ensemble de propriétés

„ une voiture possède une marque, un modèle, un numéro d'immatriculation, …

„ une maison a une adresse, un style, …

„ une personne est connue par son nom, son prénom, sa date de naissance, …

„

Les objets peuvent avoir des liens entre eux :

„ une personne possède une voiture, une maison, …

3

Les concepts de base de la POO La notion d'objets

PERSONNE

MAISON VOITURE

possède habite

Notion d'objets, relations entre les objets, ensemble d'objets,….

4

Les concepts de base de la POO La notion d'objets

„ On peut parler d'objets particuliers :

„ voiture : une Fiat Tipo, une Renault Mégane, …

„ mais tous ces objets ont les mêmes caractéristiques

„ une marque, un modèle, …

„ On peut donc aussi parler d'ensemble d'objets.

„ Îdescription d'une classe d'objets : classevoiture

„ Îdescription d'un objet particulier : une instance de la classe

„ classe voiture

„ marque, modèle, numéro d'immatriculation, …

„ un objet particulier

„ marque = Fiat, modèle=Tipo, numéro=5678FV21

5

Les concepts de base de la POO La notion d'objets

„

Des objets peuvent avoir des propriétés communes et des propriétés spécifiques.

„

Par exemple, tous les véhicules possèdent une marque, un modèle, un numéro, …

„

les camions ont en plus une charge maximale,

„

les véhicules d'entreprise font partie d'une société,

„

une ambulance possède un équipement,

„

etc …

6

Les concepts de base de la POO La notion d'objets

„

Hiérarchie de généralisation/spécialisation

VEHICULE

CAMION VEHICULE AMBULANCE

D'ENTREPRISE

(2)

7

La notion d'objets

„

La description des objets et de leurs caractéristiques s'accompagne de la description des opérations applicables sur ces objets.

„ opérations pour connaître les propriétés de l'objet

„ opérations pour mettre à jour ces propriétés

„ opérations pour manipuler les objets

„

Par exemple, pour une voiture, on peut vouloir

„ connaître sa marque, son modèle, …

„ changer son numéro d'immatriculation, …

„ dessiner cette voiture sur un écran ou une imprimante, …

8

Les concepts de base de la POO

„ Encapsulation :

„ description d'une classe d'objets, de ses propriétés et des opérations sur ces objets dans un même ensemble

„ définition de droits d'accès sur les objets ou les opérations sur les objets

„ Héritage :

„ possibilité de définir de nouveaux objets par spécialisation d'objets existants

„ hiérarchies de généralisation/spécialisation

„ Réutilisation

„ Polymorphisme

„ mécanisme sophistiqué qui permet de gérer les opérations sur les objets d'une hiérarchie

9

Les concepts de base de la POO Encapsulation

„

On veut construire un objet «complexe » constitué de deux éléments : r et i

(respect. partie réelle et partie imaginaire) et d'opérations pour le manipuler.

„

initialiser : affecte les champs d'un complexe

„

lire_r : retourne la valeur de la partie réelle

„

lire_i : retourne la valeur de la partie imaginaire

10

Les concepts de base de la POO Encapsulation

„

Définition d'une classe

class complexe {private :

int r, i; // description des champs public :

// description des méthodes int lire_r(void);

int lire_i(void);

void ecrire(int, int);

};

11

Les concepts de base de la POO Encapsulation

„

int complexe :: lire_r(void) { return(r); }

„

int complexe :: lire_i(void) {return(i); }

„

void complexe :: ecrire(int vr, int vi) {r=vr; i=vi; }

„

par défaut les droits sont fixés à la valeur "private"

„

sur l'exemple, les droits sur les membres de la classe (r et i) sont privés

12

Les concepts de base de la POO Encapsulation

„

Les droits d'accès

sur les membres d'une classe peuvent être :

„ private

„ Les membres placés en mode privé ne sont accessibles qu'aux membres de la classe elle-même.

„ protected

„ Les membres placés en mode protégé sont accessibles aux membres de la structure elle même et aux membres des classes descendantes (dans une chaîne d'héritage).

„ public

„ Les membres placés en mode public sont accessibles par tout membre situé dans la portée de la classe (en général dans tout le texte source).

(3)

13

Les concepts de base de la POO Encapsulation

„

Déclaration des objets d'une classe

„ nom_classe nom_objet;

„ Cette déclaration rend disponible un objet pour lequel sont accessibles tous les membres déclarés "public" dans la définition de la classe.

„

Pour désigner un membre d'un objet on utilise la notation

„ nom_objet. nom_membre

„ Pour les membres champs, cette notation permet un accès aux champs de la structure.

„ Pour les membres méthodes, cette notation permet d'exécuter la méthode (c'est un appel de fonction).

14

Les concepts de base de la POO Encapsulation

void main (void ) { complexe c1, c2 ;

int vr, vi;

c1.ecrire ( 0 , 0 );

cout << "partie réelle ?"; cin >> vr;

cout << "partie imaginaire ?"; cin >> vi;

c2.ecrire( vr , vi );

cout << "vérification :\n";

cout << "1" << c1.lire_r () << " + i * " << c1.lire_i () ; cout << "2" << c2.lire_r () << " + i * " << c2.lire_i () ; }

15

Les concepts de base de la POO Encapsulation

„

Remarques

„

Le programme principal ne peut pas accéder directement aux champs r et i d'un objet de la classe complexe.

„

Ses membres ont été déclarés comme privés, donc interdits en accès à toute fonction non membre de la classe.

„

L'usage des fonctions lire_r, lire_i et ecrire est obligatoire.

16

Les concepts de base de la POO Encapsulation

„

Méthodes amies

„

Idée intuitive : possibilité de donner des droits spéciaux

„ de manipulation des champs privés ou protégés d'une classe

„ à une méthode “externe” à la classe.

„

nécessité de “nommer” cette méthode comme ayant des droits spéciaux dans la classe concernée

„ concept de méthode amie d’une classe

„

C’est une méthode :

„ qui n'est pas membre de la classe

„ mais qui a le droit de manipuler les membres privés et protégés de la classe

„

La déclaration se fait par le mot-clé "friend"

17

Les concepts de base de la POO Encapsulation

„

Soit “matrice” une classe qui modélise une matrice carrée d’entiers, et certaines opérations sur les matrices (saisie, affichage, produit,...)

„

Soit “vecteur” une classe similaire sur les vecteurs

„

On souhaite définir le produit d’une “matrice” par un

“vecteur” de façon externe à ces deux classes mais en manipulant directement les champs privés de ces classes.

18

Les concepts de base de la POO Encapsulation

class matrice { int mat[MAX][MAX];

public : void affiche(void);

void saisie(void);

...

friendvecteur mult_mat_vect(matrice, vecteur);

};

class vecteur { int vect[MAX];

public : void affiche(void);

void saisie(void);

...

friendvecteur mult_mat_vect(matrice, vecteur);

};

(4)

19

Encapsulation

„ Définition de la fonction de multiplication vecteur mult_mat_vect(matrice m, vecteur v)

{ ... }

„ La fonction “mult_mat_vect” est déclarée amie des deux classes

“vecteur” et “matrice”

„ pas d'opérateur de résolution de portée car non membre de la classe

„ peut accéder aux membres privés des deux classes

„ Appel de la fonction vecteur v1,v2;

matrice mt;

...

v2= mult_mat_vect(mt,v1);

20

Encapsulation

„ Autre possibilité de définition d’une méthode amie

„ Une méthode amie d’une classe peut être membre d’une autre classe.

„ Sur l’exemple ci-dessus, on peut associer la fonction mult_mat_vect à la classe “matrice” et la déclarer comme amie de la classe “vecteur”.

class matrice { int mat[MAX][MAX];

public : void affiche(void);

void saisie(void);

vecteur mult_mat_vect(vecteur v);

...

};

21

Les concepts de base de la POO Encapsulation

class vecteur { int vect[MAX];

public :

void affiche(void);

void saisie(void);

...

friend vecteur matrice :: mult_mat_vect(matrice m, vecteur v);

};

22

Les concepts de base de la POO Encapsulation

„

Définition de la méthode de multiplication vecteur matrice :: mult_mat_vect(vecteur v)

{ ... }

„

Appel de la méthode vecteur v1,v2;

matrice mt;

...

v2= mt.mult_vect_mat(v1);

23

Les concepts de base de la POO Encapsulation

„ Lorsque toute les fonctions d’une classe sont des amies d’une autre classe, on peut déclarer globalement la classe comme étant amie de la première.

„ On souhaite par exemple que toutes les méthodes de la classe

“matrice” soient amies de la classe “vecteur”, on peut écrire : class vecteur

{ ...

friend class matrice;

...

};

„ La définition de fonctions "amies" peut remettre en cause les mécanismes de protection liés à l'encapsulation des données

„ utiles pour surcharger les opérateurs prédéfinis

24

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs

„

Les méthodes d'une classe peuvent être surchargées

„

S urcharge la méthode "ecrire" de la classe complexe selon un deuxième profil :

„

void ecrire(void)

„

qui affecte les parties réelles et imaginaires à 0.

(5)

25

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs class complexe

{private :

// description des champs int r, i;

public :

// description des méthodes membres int lire_r(void);

int lire_i(void);

void ecrire(int, int);

void ecrire(void) };

26

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs void complexe :: ecrire(int vr, int vi)

{ r=vr; i=vi; }

void complexe :: ecrire(void) { r=0; i=0; }

„

Remarque : dans ce cas particulier, le

mécanisme de valeur par défaut des paramètres pourrait être utilisé.

„

void complexe :: ecrire(int r=0, int i=0);

27

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs

„ La surcharge des opérateurs peut être réalisée à l’aide :

„ De méthodes membres de la classe,

„ de méthodes indépendantes et amies de la classe.

„ La 2 ème solution remet en cause l’encapsulation « stricte » des données de la classe.

„ Lorsque la surcharge est faite à l’aide d’une méthode indépendante, le nombre d’arguments doit être celui de l’opérateur de base.

„ Pour une méthode membre, le premier argument est toujours l’instance courante de la classe.

„ Si l’opérateur est unaire, la méthode membre n’aura donc pas d’argument.

„ Et si l’opérateur est binaire, l’argument est le membre droit de l’opérateur.

28

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs

class complexe {private :

// description des champs int r, i;

public:

// description des méthodes membres int lire_r(void);

int lire_i(void);

void ecrire(int, int);

void ecrire(void)

complexe operator+ (complexe);

complexe operator- (complexe);

};

29

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs

„

Surcharge de l'opérateur +

complexe complexe :: operator+ (complexe c) { complexe cpl;

cpl.r = r + c.r;

cpl.i = i + c.i;

return(cpl);

}

30

Les concepts de base de la POO

Surcharge des méthodes et des opérateurs

„

Utilisation de l'opérateur surchargé void main (void)

{ complexe c1, c2, c3;

c1.initialiser(4,4);

c2.initialiser(5,5);

c3 = c1 + c2; // c3 = c1.operator+(c2);

cout << c3.lire_r() << c3.lire_i() ;

}

(6)

31

Initialisation des objets d'une classe

„ De façon classique, l'initialisation d'un objet peut être faite par un appel explicite à une méthode d'écriture

class complexe {private :

int r, i;

public:

// description des méthodess membres void ecrire(int, int);

void ecrire(void) }; ...

32

Initialisation des objets d'une classe void main (void)

{ complexe c1,c2;

/* appel explicite de la méthode ecrire */

c1.ecrire(5,8);

c2.ecrire();

}

„

possibilité d'omission de l'appel de la fonction

„

idée pour plus de sécurité :

„

appel implicite à une méthode d'initialisation à la déclaration d'un objet de la classe

33

Les concepts de base de la POO

Initialisation des objets d'une classe

„

C++ propose une solution simple et élégante pour répondre à ce problème

„

possibilité de décrire une (ou des) méthode(s)

„de même nom que la classe

„et considérée comme des méthodes d'initialisation associées à chaque déclaration d'un objet

„

Les constructeurs

„

De façon similaire, il est possible de définir un destructeur,

„

méthode dont le nom est ~nom_classe,

„

appelée lorsqu'une variable est détruite.

34

Les concepts de base de la POO

Initialisation des objets d'une classe

„

Définition de la classe complexe avec un constructeur class complexe

{private : int r, i;

public :

// description d’un constructeur avec 2 arguments complexe (int, int);

// description des méthodes membres ...

};

35

Les concepts de base de la POO

Initialisation des objets d'une classe complexe :: complexe (int vr, int vi)

{ r=vr; i=vi; }

„

Déclaration d'objets avec le constructeur void main(void)

{ complexe c1(4,7);

complexe c2 = complexe (4,7);

… }

36

Les concepts de base de la POO

Initialisation des objets d'une classe

„ C++ permet de définir plusieurs constructeurs dont les profils sont différents (par leur nombre de paramètres)

„ pas d'ambiguïté pour le compilateur class complexe

{private : int r, i;

public : complexe (int, int);

complexe(int);

...

};

complexe :: complexe (int vr) { r=vr; i=0;}

(7)

37

Les concepts de base de la POO

Initialisation des objets d'une classe

„ C++ distingue plusieurs types de constructeurs. L’un d’eux est le constructeur par défaut i.e. c’est un constructeur sans paramètre

class complexe {private :

int r, i;

public :

complexe(void); // constructeur par défaut complexe (int, int);

complexe(int);

...

};

38

Les concepts de base de la POO

Initialisation des objets d'une classe complexe :: complexe (void)

{ r=0; i=0; }

„

Il est conseillé de définir systématiquement un constructeur par défaut.

„

Un constructeur dont tous les arguments ont une valeur par défaut peut être assimilé à un constructeur par défaut

complexe (int vr=0, int vi=0);

39

Les concepts de base de la POO

Initialisation des objets d'une classe

„ Le constructeur par copie

„ Son rôle est de créer une copie d’une instance existante d’un objet :

„ traitement réalisé par défaut : recopie bit à bit d’une zone de mémoire vers une autre

„ en général suffisant, sauf lorsque de l’allocation dynamique doit être réalisée pour construire l’objet cible

„ Le constructeur par copie est appelé à chaque fois qu’il est nécessaire de recopier une instance :

„ lors d’une déclaration d’une instance si l’initialisation est faite à l’aide de la valeur d’une autre

„ Lors du passage par valeur d’une instance à une fonction

„ lors du renvoi d’une instance par une fonction

„ l’utilisation de l’affectation ne provoque pas l’appel du constructeur par copie

Références

Documents relatifs

Le mot &#34;chien&#34; dans ces phrases ne change pas de classe grammaticale (toujours nom), mais ilchange de fonction :. Le chien aboie. possessifs, démonstratifs, interrogatifs,

Donner une estimation de la constante C et l’utiliser pour minorer le nombre d’itérations nécessaires pour approcher ` à 10 −3

laires dans les spectres stellaires, Bulletin de l'Académie Royale de Belgique, Classe des Sciences, 23, 287, 1937. Sur le présence de l'hydrure d'aluminium dans les spectres du

Il peut être cédé à un autre joueur Ce joker peut contrer une carte.

[r]

• Entamez le dialogue avec des gardiens du savoir et des aînés autochtones dans des centres d’amitié ou des départements d’études autochtones d’universités. • Parlez

Un tableau en Java est un objet qui peut contenir  un certain nombre de valeurs, dits éléments, d'un même type.. Ce type peut

[r]