Vous êtes sur la page 1sur 64

Programmation oriente objet avec C++

ACOO Analyse, Conception et dveloppement Orients Objet de logiciels de commande

Thmes abords
Prsentation du langage C++
Principales diffrences par rapport au C.

Orientation objet
Notion de classe et dobjet Encapsulation, public, priv. Hritage, accs protg. Polymorphisme.

Elments avancs
Programmation gnrique. Traitement derreurs par exception. Surcharge doprateurs.

Introduction la programmation oriente objet avec C++

Le langage C++
Introduction Historique
Bjarne Stroustrup cre en 1979 C With Classes Renomm C++ en 1983 C++: incrmentation, le langage aprs C Normalis par ISO

Que dfinit C++ ?


Un langage orient objet bas sur le C.
Syntaxe, instructions et code gnr similaires. Quelques incompatibilits avec C. Support de lhritage, polymorphisme, gnricit.

Une bibliothque standard


Standard C++ library
Introduction la programmation oriente objet avec C++ 2

Le langage C++
Crer un programme C++ avec Visual Studio

Donner lextension .cpp au fichier source !

Introduction la programmation oriente objet avec C++

Le langage C++
Les entres sorties standard du C++ #include <iostream> int main() { double x, y;
Bibliothque dentres sorties du C++

Flux de sortie

Oprateur surcharg en C++. Ecriture vers un flux.

std::cout << "X:"; Flux dentre. std::cin >> x; std::cout << "Y:"; Oprateur surcharg en C++. Lecture depuis un flux. std::cin >> y; std::cout << "x * y = " << x * y << std::endl; return 0; }
Introduction la programmation oriente objet avec C++

Oprateur pouvant tre chan


4

Le langage C++
Les espaces de nom - utilisation

Intrt des espaces de nom


Grands projets avec de nombreuses bibliothques
On pourrait avoir plusieurs bibliothques contenant des fonctions diffrentes avec des noms identiques. Impossibilit de construire un tel programme en C.

Espace de nom
Prfixe tous les identificateurs de lespace avec un nom. Exemple dans lespace std : std::cout

Simplification dcriture
Il est possible dimporter un espace de nom. Permet dutiliser les identificateurs de cet espace sans prfixe.

Syntaxe
using namespace std;
Introduction la programmation oriente objet avec C++ 5

Le langage C++
Les espaces de nom utilisation - exemple
#include <iostream> #include <conio.h> // Importation de l'espace de nom : using namespace std; int main() { double x, y; // Le prfixe n'est plus requis : cout << "X:"; cin >> x; cout << "Y:"; // Il est toujours possible d'utilier le prfixe : std::cin >> y; cout << "x * y = " << x * y << endl; // Les fonctions de la bibliothque C sont toujours utilisables _getch(); return 0; }
Introduction la programmation oriente objet avec C++ 6

Le langage C++
Les espaces de nom - dfinition

Il est possible de dfinir un espace de nom. Les identificateurs de cet espace sont alors prfixs. Syntaxe
namespace nom { // Placer ici les dclarations faisant partie de // l'espace de nom }

Introduction la programmation oriente objet avec C++

Le langage C++
Les espaces de nom dfinition - exemple
namespace heig_vd { void afficher_adresse() { cout << "HEIG-VD" << endl; cout << "Route de Cheseaux 1" << endl << "1401 Yverdon les bains" << endl; } void afficher_coordonnees_completes() { // Prfixe non requis, car dans le mme espace de nom : afficher_adresse(); cout << "Tel : 024 55 76 330 \n"; } } int main() { heig_vd::afficher_coordonnees_completes(); return 0; }
Introduction la programmation oriente objet avec C++ 8

Le langage C++
Les types supplmentaires du C++ - bool

C++ introduit un type pour les conditions logiques Son utilisation est recommande, mais pas obligatoire.
bool valide; valide = true; valide = false; if (valide) . . .

Introduction la programmation oriente objet avec C++

Le langage C++
Les types supplmentaires du C++ - string
Chanes de caractres
Pas de type dfini au niveau du langage C++ (idem C). Implment sous la forme dune classe dans la bibliothque standard <string>
A ne pas confondre avec string.h

Manipulation beaucoup plus commode quavec les tableaux de caractres. #include <iostream> #include <string> using namespace std; int main() { string nom; cout << "Votre nom : "; // cin >> nom; : ne saisit que le 1er mot. Utiliser getline getline(cin, nom); cout << "Bonjour " << nom << endl; char c; cin >> c; }

Exemple

Introduction la programmation oriente objet avec C++

10

Le langage C++
Les types supplmentaires du C++ - string quelques oprations
#include <iostream> #include <string> using namespace std; int main() { string chaine1, chaine2; chaine1 = "Le loup et l'agneau"; // longueur de la chaine: cout << chaine1.length() << endl; // le caractre en position 5: cout << chaine1.at(5) << endl; // sous-chaine de 4 caractres partir de la position 3 chaine2 = chaine1.substr(3, 4); cout << chaine2 << endl; char c; cin >> c; }
Introduction la programmation oriente objet avec C++ 11

Le langage C++
Contrles la compilation renforcs

Le compilateur C++ est plus strict


Le prototype dune fonction doit tre dfini avant son utilisation. Erreur systmatique gnre en cas contraire. Pas de supposition sur le type du rsultat et des paramtres. Contrle des types des paramtres lors dappels de fonctions. Lexcution dune fonction doit toujours se terminer par un return.

Introduction la programmation oriente objet avec C++

12

Le langage C++
Exemple - compilation en C dun programme incorrect

Type du paramtre incorrect

Fonction sans prototype

Aucune erreur, juste quelques warnings

La compilation a russi !
Introduction la programmation oriente objet avec C++ 13

Le langage C++
Exemple - compilation en C++ dun programme incorrect

Type du paramtre incorrect

Fonction sans prototype

En C++, erreurs de compilation gnres.

Introduction la programmation oriente objet avec C++

14

Le langage C++
Surcharge de fonctions

Plusieurs fonctions de mme nom peuvent tre dfinies


Elles doivent avoir une signature diffrente La signature est constitue de la liste des paramtres.

Exemple
int minimum(int a, int b) { return a < b ? a : b; } int minimum(int a, int b, int c) { return minimum(a, minimum(b, c)); }
Introduction la programmation oriente objet avec C++ 15

Le langage C++
Encodage de la signature des fonctions

A lissue de la compilation
Le code objet contient plusieurs fonctions minimum. Comment le lieur peut il retrouver la bonne ?

Dans le code gnr par le C++


Les noms de fonctions sont suffixs par un encodage de la signature. 2 fonctions de signature diffrente ont ainsi un nom diffrent.

Introduction la programmation oriente objet avec C++

16

Le langage C++
Encodage de la signature des fonctions

Fonction non trouve : "int __cdecl minimum(int,int)" (?minimum@@YAHHH@Z)

Introduction la programmation oriente objet avec C++

17

Le langage C++
Mlanger des fichiers sources C et C++

Problme lors du mlange de fichiers C et C++


Lib.h #ifndef __LIB_H_ int minimum(int a, int b); #endif Lib.c #include "lib.h" int minimum(int a, int b) { return a < b ? a : b; }

Main.cpp #include "lib.h" int main() { int a; a = minimum(1, 2); return 0; }


Introduction la programmation oriente objet avec C++ 18

Le langage C++
Mlanger des fichiers sources C et C++
Main.cpp #include "lib.h" int main() { int a; a = minimum(1, 2); return 0; } Lib.c #include "lib.h" int minimum(int a, int b) { return a < b ? a : b; }

Main.obj _main, utilise ?minimum@@YAHHH@Z

Lib.obj _minimum

Liaison impossible
Introduction la programmation oriente objet avec C++ 19

10

Le langage C++
Mlanger des fichiers sources C et C++ Solution
Il faut indiquer au compilateur C++ quelles fonctions utilisent les conventions de compilation du C plutt que C++. Syntaxe
extern "C" { // dclarations inteprter comme du C }

Exemple

Main.cpp extern "C" { #include "lib.h" } int main() { int a; a = minimum(1, 2); return 0; }

Introduction la programmation oriente objet avec C++

20

Le langage C++
Valeurs par dfaut des paramtres de fonctions

Valeurs par dfaut des paramtres de fonction


Ce sont des valeurs utilises pour un paramtre sil nest pas donn au moment de lappel de la fonction.

C++ permet de dfinir des valeurs par dfaut


Lorsquun paramtre a une valeur par dfaut, tous les paramtres qui suivent doivent galement en avoir une. Si le paramtre est fourni au moment de lappel, cest la valeur fournie qui est utilise. Sinon, cest la valeur par dfaut. Une fonction avec des paramtres par dfaut peut donc tre appele avec un nombre variable de paramtres.

Introduction la programmation oriente objet avec C++

21

11

Le langage C++
Valeurs par dfaut des paramtres de fonctions
#include <iostream> using namespace std; void afficher_valeur(double valeur, const char * unite = "") { cout << valeur << " " << unite << endl; } int main() { afficher_valeur(12.5, "m"); afficher_valeur(12.5); return 0; }
Introduction la programmation oriente objet avec C++ 22

Le langage C++
Les types rfrence - Introduction

Dfinition
Un type rfrence est en fait un pointeur. Utilisable sans la syntaxe fastidieuse des pointeurs du C.

Particularits
Une variable de type rfrence DOIT tre initialise. Linitialisation indique quelle variable est rfrence. Il nest ensuite plus possible de modifier la rfrence.

Syntaxe
type & nom_reference = variable_referencee;

Introduction la programmation oriente objet avec C++

23

12

Le langage C++
Les types rfrence - Introduction

Exemple
double x = 0.0, y = 1.0; // dclaration et initialisation de la rfrrence : double & rx = x; // affectation de la variable rfrence rx = y; cout << "x :" << x << endl;

Comportement
A linitialisation, la rfrence reoit ladresse dune variable. Lors de toutes les affectations ultrieures, cest la variable rfrence qui est modifie. La rfrence dsigne donc toujours la mme variable pendant toute sa dure de vie.
Introduction la programmation oriente objet avec C++ 24

Le langage C++
Passage de paramtres par rfrence

Une rfrence est en fait un pointeur Permet donc de raliser le passage de paramtre par adresse. Sans la syntaxe lourde des pointeurs. Avec les rfrences, C++, offre une solution lgante pour le passage de paramtres par variable.

Introduction la programmation oriente objet avec C++

25

13

Le langage C++
Passage de paramtres par rfrence
void echanger(int & a, int & b) { int temporaire; temporaire = a; a = b; b = temporaire; } int main() { int i, j; i = 1; j = 2; cout << "i: " << i << " ; j: " << j << endl; echanger(i, j); cout << "i: " << i << " ; j: " << j << endl; }

Introduction la programmation oriente objet avec C++

26

Le langage C++
Rsultat de fonction de type rfrence
Une fonction peut retourner une rfrence (donc une adresse)
On peut affecter la variable rfrence retourne. On peut ainsi placer un appel de fonction gauche dune affectation !

Exemple
double tableau[100]; double & element(int i) { return tableau[i]; } int main() { element(5) = 123; cout << element(5) << endl; cin >> element(10); cout << element(10) << endl; }

Introduction la programmation oriente objet avec C++

27

14

Le langage C++
Gestion de fichiers au format texte - criture
#include <fstream> using namespace std; int main() { // dclaration d'un objet flux pour le fichier ofstream fichier; int i; // ouverture du fichier fichier.open("carres.txt"); // criture dans le fichier fichier << "Les carres de 1 a 100" << endl; for (i = 1 ; i <= 100; i++) fichier << i << "^2 : " << i * i << endl; // fermeture du fichier fichier.close(); }

Introduction la programmation oriente objet avec C++

28

Le langage C++
Gestion de fichiers au format texte - criture
#include <fstream> using namespace std; int main() { // dclaration d'un objet flux pour le fichier ofstream fichier; int i; // ouverture du fichier fichier.open("carres.txt"); // criture dans le fichier fichier << "Les carres de 1 a 100" << endl; for (i = 1 ; i <= 100; i++) fichier << i << "^2 : " << i * i << endl; // fermeture du fichier fichier.close(); }

Introduction la programmation oriente objet avec C++

29

15

Le langage C++
Gestion de fichiers au format texte - lecture
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { // dclaration d'un objet flux pour le fichier ifstream fichier; string ligne; int nombre_ligne = 0; // ouverture du fichier fichier.open("carres.txt"); while (!fichier.eof()) { // lecture du fichier, vrification du succs if (getline(fichier, ligne)) nombre_ligne ++; } // fermeture du fichier fichier.close(); cout << "Le fichier comporte " << nombre_ligne << " lignes." << endl; }
Introduction la programmation oriente objet avec C++ 30

Le langage C++
Gestion de fichiers open

Prototype
void open(const char *_Filename, ios_base::openmode _Mode;

Openmode
app : append, va la fin avant chaque ajout. ate : ouvre le fichier et va la fin 1 fois. binary, : ouvre le fichier en mode binaire. in : ouvre en lecture out : ouvre en criture trunc : crase le fichier louverture.

Exemple
fstream fichier; fichier.open ("test.bin", ios::out | ios::app | ios::binary);
Introduction la programmation oriente objet avec C++ 31

16

Le langage C++
La gestion des erreurs exceptionnelles
int ListeDouble::Ajouter(double x) { int indice; if (nombre_elements < CAPACITE) { indice = nombre_elements; tableau[indice] = x; nombre_elements++; } else indice = INDICE_INVALIDE; return indice; } int Filtre::Echantilloner(double amplitude) { if (liste.Ajouter(amplitude) != INDICE_INVALIDE) return 1; else { printf("Erreur"); return 0; } }

double FiltreMedian(double valeurs[], int nombre) { int i; Filtre f; for (i = 0; i < nombre_valeurs; i++) if (!f.Echantilloner(valeurs[i])) return AMPLITUDE_INVALIDE; return f.CalculerValeurMediane(); }
Introduction la programmation oriente objet avec C++

Le code produit pour grer les erreurs exceptionnelles reprsente 50 % Beaucoup deffort pour propager lerreur liste pleine vers les fonctions de niveau suprieur.
32

Le langage C++
Les exceptions

Lors de la dtections dune erreur


On lve une exception. Une exception est un signal logiciel, accompagn dune donne. La donne peut tre de nimporte quel type
Souvent un objet, de classe (ou sous classe) exception .

Le traitement en cours est interrompu. Lexception se propage travers les fonctions appelantes.
Sans avoir aucun code crire pour cela.

Jusqu ce quelle soit capture.


Au moment de la capture, la donne associe est rcuprable.

Si elle nest pas traite


En gnral : terminaison de lapplication.
Introduction la programmation oriente objet avec C++ 33

17

Le langage C++
Les exceptions - Syntaxe
Lever une exception
throw exception("Liste pleine"); throw 1.5; // pas trs usuel

Capturer une exception


try { // Placer ici le code pouvant gnrer une exception // que l'on veut capturer } // blocs de capture : un a plusieurs selon les besoins catch (exception & e) { cout << e.what() << endl; } catch (...) // ... signifie capturer tout { cout << "Exception de type inattendu\n" << endl; throw; // redclenchement de l'exception capture }
Introduction la programmation oriente objet avec C++ 34

Le langage C++
La gestion des erreurs avec les exceptions
int ListeDouble::Ajouter(double x) { int indice; if (nombre_elements < CAPACITE) { indice = nombre_elements; tableau[indice] = x; nombre_elements++; } else throw exception("Liste pleine"); return indice; } void Filtre::Echantilloner(double amplitude) { liste.Ajouter(amplitude); }

Plus aucun code crire pour la propagation des erreurs ! Programmation beaucoup plus efficace.

double FiltreMedian(double valeurs[], int nombre) { int i; Filtre f; for (i = 0; i < nombre_valeurs; i++) f.Echantilloner(valeurs[i]); return f.CalculerValeurMediane(); }

Introduction la programmation oriente objet avec C++

35

18

Le langage C++
La gestion des erreurs avec les exceptions
Traitement de lexception
Se fait seulement au niveau o lon sait comment ragir. Exemple : dans main, afficher simplement un message derreur.

Exemple simple
double acquisitions[100]; double valeur_filtree; . . . try { valeur_filtree = filtre_median(acquisitions, 100); } catch (exception & e) { cout << "Erreur durant le filtrage : " << e.what() << endl; }

Introduction la programmation oriente objet avec C++

36

Le langage C++
La gestion des erreurs avec les exceptions

Recommandation
Utiliser la gestion par exception seulement pour les situations exceptionnelles. Prfrer des tests avec if pour les situations probables.

Introduction la programmation oriente objet avec C++

37

19

Le langage C++
Allocation dynamique de mmoire

C++ offre un oprateur pour lallocation dynamique


Oprateur new. Syntaxe et utilisation beaucoup plus clairs que les malloc du C.

Syntaxe
TYPE * variable; variable = new TYPE;

Exemple allocation dune cellule pour une file chaine


struct CELLULE_FILE_CHAINEE * cellule; cellule = new CELLULE_FILE_CHAINEE; cellule->element = 10.5;

Introduction la programmation oriente objet avec C++

38

Le langage C++
Allocation dynamique de mmoire

C++ offre galement un oprateur pour la libration


Oprateur delete.

Syntaxe
TYPE * variable; variable = new TYPE; . . . delete variable;

Introduction la programmation oriente objet avec C++

39

20

Le langage C++
Allocation dynamique de mmoire les tableaux

Loprateur new permet dallouer un tableau dlments


tableau = new type[taille];

Syntaxe de loprateur delete pour les tableaux


delete []tableau;

Allocation dynamique du C++


Plus facile utiliser. Plus lisible. A prfrer pour tout dveloppement en C++. A utiliser imprativement ds quon alloue des objets.
40

Introduction la programmation oriente objet avec C++

Le langage C++
Allocation dynamique de mmoire les tableaux - exemple
int main() { double * tableau; int i, taille; cout << "Taille:"; cin >> taille; // Allocation dynamique du tableau tableau = new double[taille]; for (i = 0; i < taille; i++) { cout << "Element " << i + 1 << " : "; cin >> tableau[i]; } // Libration du tableau delete []tableau; _getch(); return 0; }

Introduction la programmation oriente objet avec C++

41

21

Introduction la programmation oriente objet avec C++

42

Programmation oriente objet en C++


Introduction : Rappel le TDA Nombre complexe en C
typedef struct { double reel, imaginaire; } COMPLEXE; void complexe_initialiser(COMPLEXE* z); void complexe_ecrire_cartesien(COMPLEXE* z, double re, double im); void complexe_ecrire_polaire(COMPLEXE* z, double module, double argument); double double double double complexe_lire_reelle(COMPLEXE z); complexe_lire_imaginaire(COMPLEXE z); complexe_lire_module(COMPLEXE z); complexe_lire_argument(COMPLEXE z);

COMPLEXE complexe_oppose(COMPLEXE z); COMPLEXE complexe_conjugue(COMPLEXE z); COMPLEXE complexe_somme(COMPLEXE z1, COMPLEXE z2);

Introduction la programmation oriente objet avec C++

43

22

Les types de donne abstraits


Exemple dutilisation correcte
#include "complexes.h" int main() { COMPLEXE z1, z2, z3; complexe_initialiser(&z1); complexe_initialiser(&z2); complexe_ecrire_cartesien(&z1, 3, 0); complexe_ecrire_cartesien(&z2, 0, 2); z3 = complexe_somme(z2, z1); printf("z3 = %lf + i . %lf\n", complexe_lire_reelle(z3), complexe_lire_imaginaire(z3)); system("PAUSE"); return 0; }

Introduction la programmation oriente objet avec C++

44

Les types de donne abstraits


Exemple dutilisation incorrecte
#include "complexes.h" int main() { COMPLEXE z1 = {3.0, 0.0}, z2, z3; z2.reel = 0.0; z2.imaginaire = 2.0; z3 = complexe_somme(z2, z1); printf("z3 = %lf + i . %lf\n", complexe_lire_reelle(z3), complexe_lire_imaginaire(z3)); system("PAUSE"); return 0; }

Attention. Mauvaise utilisation, car ne respecte pas labstraction du type.

Introduction la programmation oriente objet avec C++

45

23

Programmation oriente objet en C++


Introduction : Rappel le TDA Nombre complexe en C - Analyse
void complexe_initialiser(COMPLEXE* z); void complexe_ecrire_cartesien(COMPLEXE* z, double re, double im); void complexe_ecrire_polaire(COMPLEXE* z, double module, double argument);

Syntaxe fastidieuse
Noms de mthodes prfixs par complexe
pour rappeler le TDA dappartenance

Il faut toujours passer la structure en paramtre par adresse

C++ : nouvelle syntaxe facilitant la programmation des TDA


Des fonctions peuvent tre dclares dans un struct. On les appelle alors des mthodes . Ces mthodes ont accs directement aux variables de la struct.
Introduction la programmation oriente objet avec C++ 46

Programmation oriente objet en C++


Les mthodes : des fonctions associes la structure - dclaration
struct Complexe { double reelle, imaginaire; void DefinirCartesien(double re, double im); void DefinirPolaire(double module, double argument); double double double double LireReelle(); LireImaginaire(); LireModule(); LireArgument();

Complexe Oppose(); Complexe Conjugue(); };


Introduction la programmation oriente objet avec C++ 47

24

Programmation oriente objet en C++


Les mthodes : des fonctions associes la structure - implmentation
void Complexe::DefinirCartesien(double re, double im) { reelle = re; imaginaire = im; Dans limplmentation, les } mthodes sont prfixes par le nom du type. double Complexe::LireReelle() { return reelle; Tous les champs de la structure } sont accessibles directement depuis les mthodes. double Complexe::LireModule() { return sqrt(reelle * reelle + imaginaire * imaginaire); } Complexe Complexe::Conjugue() { Complexe resultat; resultat.DefinirCartesien(reelle, -imaginaire); return resultat; }
Introduction la programmation oriente objet avec C++ 48

Programmation oriente objet en C++


Les mthodes : des fonctions associes la structure - utilisation
#include <iostream> #include "complexe.h" using namespace std; int main() { Complexe z1, z2; z1.DefinirCartesien(1.5, 2.0); z2 = z1.Conjugue(); cout << "z1 : " << z1.LireReelle() << " + i . " << z1.LireImaginaire() << endl; cout << "z2 : " << z2.LireReelle() << " + i . " << z2.LireImaginaire() << endl; }
Syntaxe allge. Le mot struct na pas besoin dtre rpt.

On utilise le point pour accder aux mthodes (comme pour les champs)

Introduction la programmation oriente objet avec C++

49

25

Programmation oriente objet en C++


Les mthodes : accs aux membres comparaison C / C++

En langage C
void complexe_definir_cartesien(COMPLEXE* z, double re, double im) { z->reel = re; Ladresse de la structure est z->imaginaire = im; videmment requise pour } accder aux champs.

En langage C++
void Complexe::DefinirCartesien(double re, double im) { reelle = re; Ladresse de la structure nest imaginaire = im; pas passe, et pourtant a } fonctionne !?

Introduction la programmation oriente objet avec C++

50

Programmation oriente objet en C++


Les mthodes : accs aux membres Le pointeur this
En C++, les mthodes reoivent un paramtre invisible. Il sappelle this . Cest un pointeur sur la structure sur laquelle la mthode est appele.

Code crit :
void Complexe::DefinirCartesien(double re, double im) { reelle = re; imaginaire = im; }

De faon interne et silencieuse, le code vraiment compil est :


void Complexe::DefinirCartesien (Complexe * this, double re, double im) { this->reelle = re; this->imaginaire = im; }

Introduction la programmation oriente objet avec C++

51

26

Programmation oriente objet en C++


Grer la visibilit : public et private

Rappel TDA
TDA : Type de Donnes Abstrait. On ne devrait jamais accder directement aux champs de la structure. Mais rien ne nous empche de le faire !

Mauvais exemple dutilisation du TDA:


int main() { Complexe z1, z2; z1.reelle = 1.5; z1.imaginaire = 2.0; z2 = z1.Conjugue(); . . . . }
Introduction la programmation oriente objet avec C++

Accs direct aux champs. Rompt labstraction.

52

Programmation oriente objet en C++


Grer la visibilit : public et private
C++ apporte des amliorations pour les TDA
Possibilit dinterdire laccs aux membres par les utilisateurs dun type. Syntaxe : modificateurs public et private
Laccs direct ces champs hors des mthodes du type Complexe sera interdit par le compilateur.

Exemple :
struct Complexe { private: double reelle, imaginaire;

public: void DefinirCartesien(double re, double im); void DefinirPolaire(double module, double argument); double LireReelle(); double LireImaginaire(); . . . };

Le type complexe peut seulement tre utilis avec les mthodes publiques prvues. Garantit le respect de labstraction

Introduction la programmation oriente objet avec C++

53

27

Programmation oriente objet en C++


Notion de classe La programmation oriente objet
Elle est base sur la notion de classe. (explicite plus loin)

Comment dclarer une classe en C++ ?


Il suffit dutiliser le mot class la place du mot struct.
class Complexe { private: double reelle, imaginaire; public: void DefinirCartesien(double re, double im); void DefinirPolaire(double module, double argument); double LireReelle(); double LireImaginaire(); . . . . };
Introduction la programmation oriente objet avec C++ 54

Programmation oriente objet en C++


Diffrence entre class et struct

Points communs
class et struct permettent tous deux de dclarer des classes. Le code gnr est 100 % identique.

Diffrences
Avec la dclaration struct
Par dfaut, tous les membres sont publics.

Avec la dclaration class


Par dfaut, tous les membres sont privs.

Lequel prfrer ?
En programmation oriente objet, on utilise habituellement class. Par dfaut, tout ce qui nest pas explicitement rendu public par le programmeur est ainsi priv.
Introduction la programmation oriente objet avec C++ 55

28

Programmation oriente objet en C++


Notion dobjet

Dfinition
Un objet est une instance dune classe. Cest--dire une variable de ce type.

Exemples
Complexe z1, z2; Complexe * z3; z3 = new Complexe; z1 et z2 sont des objets. z3 est un pointeur sur un objet (son adresse).

Introduction la programmation oriente objet avec C++

56

Programmation oriente objet en C++


C++ et compilation spare

Le fichier .h
Contient habituellement les dclarations de classes, mthodes,

Le fichier .cpp
Contient limplmentation des mthodes.

Introduction la programmation oriente objet avec C++

57

29

Programmation oriente objet en C++


Surcharge des oprateurs

Surcharge des oprateurs


Permet de donner un sens nouveau aux oprateurs. Seulement pour les types dfinis par le programmeur.

Exemple :

surcharge de << pour le type Complexe

Oprateur dclar EN DEHORS de la classe.

ostream & operator<<(ostream & stream, const Complexe & z) { stream << z.LireReelle(); if (z.LireImaginaire() < 0.0) stream << " - " << - z.LireImaginaire() << " . i"; else if (z.LireImaginaire() > 0.0) stream << " + " << z.LireImaginaire() << " . i"; return stream; }

Introduction la programmation oriente objet avec C++

58

Programmation oriente objet en C++


Mthodes const

Problme
z est un paramtre const. A-t-on le droit dappeler une mthode sur un const ? Et si la mthode modifiait la constante ? Compilateur: refus des appels de mthodes normales sur des objets const
class Complexe { . . . . double LireReelle() const; double LireImaginaire() const; double LireModule() const; double LireArgument() const; . . . . };
Introduction la programmation oriente objet avec C++ 59

Solution : dclarer les mthodes const

30

Programmation oriente objet en C++


Surcharge des oprateurs - utilisation
#include <iostream> #include "complexe.h" using namespace std; int main() { Complexe z1, z2; z1.DefinirCartesien(1.5, 2.0); z2 = z1.Conjugue(); cout cout cout cout << << << << "z1 : z1 << "z2 : z2 << "; endl; "; endl; Utilisation du nouvel oprateur <<

char c; cin >> c; }

Introduction la programmation oriente objet avec C++

60

Programmation oriente objet en C++


Surcharge des oprateurs laddition de complexes

Dclaration dun oprateur dans la classe


class Complexe { public: . . . . Complexe operator+(const Complexe & operande); . . . . };

Implmentation
Complexe Complexe::operator+(const Complexe & operande) { Complexe resultat; resultat.reelle = reelle + operande.reelle; resultat.imaginaire = imaginaire + operande.imaginaire; return resultat; }
Introduction la programmation oriente objet avec C++ 61

31

Programmation oriente objet en C++


Surcharge des oprateurs laddition de complexes - utilisation
#include <iostream> #include "complexe.h" using namespace std; int main() { Complexe z1, z2; z1.DefinirCartesien(1.5, 2.0); z2.DefinirCartesien(3.0, 4.0); cout cout cout cout cout } << << << << << "z1 : z1 << "z2 : z2 << "z1 + "; endl; "; endl; z2 : " << z1 + z2 << endl; Style de programmation naturel grce aux oprateurs dfinis.

Introduction la programmation oriente objet avec C++

62

Programmation oriente objet en C++


Usages pour les noms des accesseurs

Usage gnral
Le code source est crit en langue anglaise

Mthodes daccs en lecture


On utilise le terme get : obtenir
double GetReal() const(); double GetImaginary() const;

Mthodes daccs en criture


On utilise le terme set : dfinir
void SetReal(double value);

Terminologie
On parle de getter et de setter

Introduction la programmation oriente objet avec C++

63

32

Programmation oriente objet en C++


Initialisation et finalisation dun TDA

Principes dutilisation des TDA


Initialisation : prparer les variables internes avant lutilisation. Utilisation normale. Finalisation : librer les ressources alloues
Exemple : librer la mmoire alloue dynamiquement avec malloc.

En C: initialisation et finalisation appeler explicitement.

Apport du C++
Notion de constructeur
Mthode dinitialisation dun objet. Appele automatiquement la cration de lobjet.

Notion de destructeur
Mthode de finalisation dun objet. Appele automatiquement la destruction de lobjet.

Introduction la programmation oriente objet avec C++

64

Programmation oriente objet en C++


Constructeur - Introduction

Exemple objet non initialis int main()


{ Complexe z1; cout << "z1 : "; cout << z1 << endl; // non initialis ! }

Introduction la programmation oriente objet avec C++

65

33

Programmation oriente objet en C++


Constructeur dclaration et dfinition Dclaration
class Complexe { private: double reelle, imaginaire; public: Complexe(); . . . };

Mthode dclare: - Avec le nom de la classe. - Sans aucun type de rsultat.

Dfinition
Complexe::Complexe() { reelle = 0.0; imaginaire = 0.0; }
Introduction la programmation oriente objet avec C++ 66

Programmation oriente objet en C++


Constructeur

Exemple objet initialis automatiquement


int main() { Complexe z1; // Initialis par le constructeur ! cout << "z1 : "; cout << z1 << endl; }

Introduction la programmation oriente objet avec C++

67

34

Programmation oriente objet en C++


Constructeur paramtr

Dclaration
class Complexe { public: Complexe(); Complexe(double re, double im); . . . };

Dfinition
Complexe::Complexe(double re, double im) { DefinirCartesien(re, im); }
Introduction la programmation oriente objet avec C++ 68

Programmation oriente objet en C++


Constructeur

Exemple objet initialis avec des paramtres


int main() { Complexe z1(1.0, 2.5); cout << "z1 : "; cout << z1 << endl; }

Introduction la programmation oriente objet avec C++

69

35

Programmation oriente objet en C++


Objets membres et constructeur

On construit une classe SimulationImpedance En utilisant un objet Complexe pour limpdance


class SimulationImpedance { private: Complexe impedance; double frequence; public: void DefinirFrequence(double f); void DefinirImpedance(const Complexe & z); };

Introduction la programmation oriente objet avec C++

70

Programmation oriente objet en C++


Objets membres et constructeur

Utilisation
int main() { SimulationImpedance s1, s2; }

Que se passe-t-il la construction de s1, s2 ?


Construction des objets interne. Appel automatique du constructeur de Complexe .

Introduction la programmation oriente objet avec C++

71

36

Programmation oriente objet en C++


Une liste tableau simple en C++ Exemple : liste de double
#define CAPACITE 100 class ListeDouble { private: double * tableau; int nombre_elements; public: ListeDouble(); ~ListeDouble(); ListeDouble(const ListeDouble & liste); ListeDouble & operator=(const ListeDouble & valeur); int Ajouter(double x); int LireNombreElement() const; double LireElement(int indice) const; double operator[](int indice) const; };
Introduction la programmation oriente objet avec C++ 72

Programmation oriente objet en C++


Une liste tableau simple en C++

Constructeur par dfaut


ListeDouble::ListeDouble() { nombre_elements = 0; tableau = new double[CAPACITE]; }

Libration de la mmoire
La mmoire alloue dynamiquement doit tre libre. Solution en C++ : le destructeur
Mthode appele automatiquement lorsque lobjet disparait.

Introduction la programmation oriente objet avec C++

73

37

Programmation oriente objet en C++


Destructeur

Dclaration
class ListeDouble { public: ListeDouble(); ~ListeDouble(); . . . };
Destructeur: - Nom de la classe, prcd de ~ - Sans aucun type de rsultat.

Dfinition
ListeDouble::~ListeDouble() { delete []tableau; }
Introduction la programmation oriente objet avec C++ 74

Programmation oriente objet en C++


Constructeur et destructeur illustration
int main() { ListeDouble liste1; // construction de liste1 ListeDouble liste2; // construction de liste2 // liste1 et liste2 sont utilisables liste1.Ajouter(2); liste1.Ajouter(7); liste1.Ajouter(4); liste2 = liste1;

// A la sortie du bloc ou de la fonction // destruction automatique de liste2 // destruction automatique de liste1 }


Introduction la programmation oriente objet avec C++ 75

38

Programmation oriente objet en C++


Une liste tableau simple en C++

Utilisation
int main() { ListeDouble liste1, liste2; liste1.Ajouter(3.0); liste2 = liste1; }

Constat
Objets trs facile utiliser. Construits et dtruits automatiquement.

Problme
// Que fait cette instruction ? liste2 = liste1;

Exception la fin du programme !


Introduction la programmation oriente objet avec C++ 76

Programmation oriente objet en C++


Mthodes par dfaut

En C++, toute classe a au minimum


1 Constructeur par dfaut. 1 Constructeur copie.
Appel lors de linitialisation dun objet. Copie chaque champ.

1 Oprateur daffectation.
Appel lors de laffectation dun objet. Copie chaque champ.

Par dfaut, ces mthodes sont gnres automatiquement.

Introduction la programmation oriente objet avec C++

77

39

Programmation oriente objet en C++


Une liste tableau simple en C++ - initialisation incorrecte de lobjet

Avant liste2 = liste1;


2 8 7 2 4 7

liste2 tableau nombre_elements

liste1 tableau nombre_elements

Introduction la programmation oriente objet avec C++

78

Programmation oriente objet en C++


Une liste tableau simple en C++ - initialisation incorrecte de lobjet

Aprs liste2 = liste1;


2 8 7 2 4 7

liste2 tableau nombre_elements

liste1 tableau nombre_elements

Introduction la programmation oriente objet avec C++

79

40

Programmation oriente objet en C++


Une liste tableau simple en C++ - initialisation incorrecte de lobjet

Consquences
Une modification ultrieure de liste1 modifie aussi liste2 ! Lors de la destruction
La destruction de liste2 libre le bloc de mmoire de liste1. Lors de la destruction de liste1, ce bloc est libr une deuxime fois. Do une erreur fatale.

Comportement souhaitable
Lors de laffectation ou de linitialisation de liste2, il faudrait
Copier le contenu de liste1 dans le tableau de liste2. Copier le nombre dlments.

Ce comportement peut tre programm :


Initialisation : surcharge du constructeur copie. Affectation : surcharge de loprateur =
Introduction la programmation oriente objet avec C++ 80

Programmation oriente objet en C++


Une liste tableau simple en C++ - affectation correcte de lobjet
Dclaration
class ListeDouble { public: ListeDouble & operator=(const ListeDouble & valeur); . . . . };

Dfinition
ListeDouble & ListeDouble::operator=(const ListeDouble & liste) { int i; // Copie des lments du tableau for (i = 0; i < liste.nombre_elements; i++) tableau[i] = liste[i]; // Copie du nombre dlments nombre_elements = liste.nombre_elements; // laffectation renvoie la valeur de gauche // Requis pour permettre le chanage des affectations. return *this; }

Introduction la programmation oriente objet avec C++

81

41

Programmation oriente objet en C++


Une liste tableau simple en C++ - initialisation correcte de lobjet
Dclaration
class ListeDouble { public: ListeDouble(); ~ListeDouble(); ListeDouble(const ListeDouble & liste); . . . . };

Dfinition
ListeDouble::ListeDouble(const ListeDouble & liste) { int i; // Constructeur : cration du tableau ncessaire tableau = new double[CAPACITE]; // Copie des lments utiliss for (i = 0; i < liste.nombre_elements; i++) tableau[i] = liste[i]; // Copie du nombre dlments nombre_elements = liste.nombre_elements; }

Introduction la programmation oriente objet avec C++

82

Introduction la programmation oriente objet avec C++

83

42

Programmation oriente objet en C++


Hritage - Introduction
Dveloppement dun logiciel de simulation lectrique Composants pris en compte sous forme de classes spares :
Resistance Inductance Condensateur Nombreux points communs
Resistance + + + + resistance: double nom: string CalculerImpedance(double) : Complexe DefinirNom(string) : void LireNom() : string AfficherCaracteristiques() : void + + + + Inductance inductance: double nom: string CalculerImpedance(double) : Complexe DefinirNom(string) : void LireNom() : string AfficherCaracteristiques() : void + + + + Condensateur capacite: double nom: string CalculerImpedance(double) : Complexe DefinirNom(string) : void LireNom() : string AfficherCaracteristiques() : void

Observation

Introduction la programmation oriente objet avec C++

84

Programmation oriente objet en C++


Hritage - Introduction

Possibilit oriente objet du C++


Crer une classe de base contenant les lments communs Crer chaque classe particulire en hritant des caractristiques communes de la classe de base

Intrt
Eviter les rptitions de code. Approche hirarchique des problmes.

Introduction la programmation oriente objet avec C++

85

43

Programmation oriente objet en C++


Hritage - Introduction

Nouvelle rpartition pas de rptition de code

Introduction la programmation oriente objet avec C++

86

Programmation oriente objet en C++


Hritage Ralisation en C++
class ComposantPassif { private: string nom; public: void DefinirNom(const string & valeur); string LireNom() const; void AfficherCaracteristiques() const; }; Condensateur hrite de ComposantPassif : -Il reoit tous les attributs et mthodes de cette classe. - Lhritage tant public, tous les lments publics hrits de ComposantPassif seront publics sur la classe Condensateur.

class Condensateur: public ComposantPassif { private: double capacite; public: Complexe CalculerImpedance(double frequence) const; void DefinirCapacite(double valeur); double LireCapacite() const; };

Introduction la programmation oriente objet avec C++

87

44

Programmation oriente objet en C++


Hritage Ralisation en C++
// Classe composant passif void ComposantPassif::DefinirNom(const string & valeur) { nom = valeur; } string ComposantPassif::LireNom() const { return nom; } void ComposantPassif::AfficherCaracteristiques() const { cout << "Nom : " << nom << endl; }
Introduction la programmation oriente objet avec C++ 88

Programmation oriente objet en C++


Hritage Ralisation en C++
// Classe Condensateur Complexe Condensateur::CalculerImpedance(double frequence) const { Complexe resultat; resultat.DefinirCartesien(0, - 1.0 / (capacite * 2 * M_PI * frequence)); return resultat; } void Condensateur::DefinirCapacite(double valeur) { capacite = valeur; } double Condensateur::LireCapacite() const { return capacite; }

Introduction la programmation oriente objet avec C++

89

45

Programmation oriente objet en C++


Hritage Ralisation en C++
int main() { ComposantPassif compo1; Condensateur c1; compo1.DefinirNom("Composant 1"); c1.DefinirNom("Condensateur 1"); c1.DefinirCapacite(4.7e-6); // 4.7 F compo1.AfficherCaracteristiques(); cout << endl; c1.AfficherCaracteristiques(); cout << endl; pause(); }
Introduction la programmation oriente objet avec C++ 90

Mthodes dfinies seulement dans ComposantPassif. Disponibles dans Condensateur par hritage public.

Programmation oriente objet en C++


Hritage Ralisation en C++

Rsultat :

Observation
Condensateur a bien hrit des attributs et mthodes de ComposantPassif Rsultat incomplet :
Pour un condensateur, il faudrait aussi afficher la capacit. Solution : redfinir la mthode AfficherCaracteristiques .

Introduction la programmation oriente objet avec C++

91

46

Programmation oriente objet en C++


Hritage Redfinir une mthode pour enrichir le comportement

Dclaration
class Condensateur: public ComposantPassif { public: . . . void AfficherCaracteristiques() const; };

Redclaration de la mthode AfficherCaracteristiques.

Appel de la mthode de la classe parent.

Dfinition
void Condensateur::AfficherCaracteristiques() const { ComposantPassif::AfficherCaracteristiques(); cout << "Capacite : " << capacite * 1.0e6 << " uF" << endl; }

Rsultat

Introduction la programmation oriente objet avec C++

92

Programmation oriente objet en C++


Hritage Reprsentation en mmoire

ComposantPassif string nom

Condensateur string nom double capacite

Organisation en mmoire identique

Consquences affectations possibles


compo1 = c1; // Ok, dfinit entirement compo1 c1 = compo1; // Interdit, ne dfinit pas compltement c1

Introduction la programmation oriente objet avec C++

93

47

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Introduction

On souhaite crire une fonction


Calculant et affichant les valeurs dimpdances toutes les dcades (1, 10, 100, 1000, 10000 Hz) Utilisable avec tous types dimpdances
Rsistances, Condensateurs, Inductances, autres

Prototype pour une rsistance


void AfficherValeursImpedance(const Resistance & composant);

Prototype pour un condensateur


void AfficherValeursImpedance(const Condensateur & composant);

Prototype pour une inductance


void AfficherValeursImpedance(const Inductance & composant);

Introduction la programmation oriente objet avec C++

94

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Introduction

Implmentation : 3 fois le mme code !


void AfficherImpedance(const Resistance & composant) { double frequence = 1.0; Complexe impedance; void AfficherImpedance(const Condensateur & composant) composant.AfficherCaracteristiques(); { while (frequence <= 1.0e6) double frequence = 1.0; { Complexe impedance; impedance = composant.CalculerImpedance(frequence); void AfficherImpedance(const Inductance & composant) composant.AfficherCaracteristiques(); cout << frequence << "{ Hz : " << impedance << endl; while (frequence <= 1.0e6) frequence = frequence * 10; double frequence = 1.0; { } Complexe impedance; impedance = composant.CalculerImpedance(frequence); } composant.AfficherCaracteristiques(); cout << frequence << " Hz : " << impedance << endl; while (frequence <= 1.0e6) frequence = frequence * 10; { } impedance = composant.CalculerImpedance(frequence); } cout << frequence << " Hz : " << impedance << endl; frequence = frequence * 10; } }

Introduction la programmation oriente objet avec C++

95

48

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Introduction
int main() { Condensateur c1; Inductance l1; Resistance r1; r1.DefinirNom("Resistance 1"); r1.DefinirResistance(1000); c1.DefinirNom("Condensateur 1"); c1.DefinirCapacite(4.7e-6); // 4.7 F l1.DefinirNom("Inductance 1"); l1.DefinirInductance(25e-3); // 25 mH AfficherImpedance(r1); AfficherImpedance(c1); AfficherImpedance(l1); pause(); }
Introduction la programmation oriente objet avec C++ 96

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Solution pour viter de rpter 3 fois le code ?


Utiliser le type de base ComposantPassif comme paramtre. Rsistance, Condensateur et Inductance hritent de ComposantPassif.
ComposantPassif + + + nom: string DefinirNom(st ring) : void LireNom() : string AfficherCaracteristiques() : void

Induc tance + inductance : double CalculerImpedance(double) : Complexe

Problme

void AfficherImpedance(const ComposantPassif & composant) { double frequence = 1.0; Complexe impedance; composant.AfficherCaracteristiques(); while (frequence <= 1.0e6) { impedance = composant.CalculerImpedance(frequence); cout << frequence << " Hz : " << impedance << endl; frequence = frequence * 10; } }

CalculerImpedance nest pas dclare sur ComposantPassif ! Donc, compilation impossible.


Introduction la programmation oriente objet avec C++ 97

49

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Dclarer CalculerImpedance pour la classe parent


class ComposantPassif { public: . . . . Complexe CalculerImpedance(double frequence) const; }; Complexe ComposantPassif::CalculerImpedance(double frequence) const { Complexe resultat; resultat.DefinirCartesien(0.0, 0.0); return resultat; }

On choisit de retourner 0, car on ne sait pas comment calculer dans la classe ComposantPassif.
Introduction la programmation oriente objet avec C++ 98

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme Test
void AfficherImpedance(const ComposantPassif & composant) { double frequence = 1.0; Complexe impedance; composant.AfficherCaracteristiques(); while (frequence <= 1.0e6) int main() { { impedance = composant.CalculerImpedance(frequence); Condensateur c1; coutl1; << frequence << " Hz : " << impedance << endl; Inductance frequence = frequence * 10; Resistance r1; } }r1.DefinirNom("Resistance 1"); r1.DefinirResistance(1000); c1.DefinirNom("Condensateur 1"); c1.DefinirCapacite(4.7e-6); // 4.7 F l1.DefinirNom("Inductance 1"); l1.DefinirInductance(25e-3); // 25 mH AfficherImpedance(r1); AfficherImpedance(c1); AfficherImpedance(l1); pause(); }
Introduction la programmation oriente objet avec C++ 99

50

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme Observations

Fonctionnement non satisfaisant


AfficherCaracteristiques
Cest la mthode de base de ComposantPassif qui est appele. Elle naffiche que le nom du composant, pas ses valeurs.

CalculerImpedance
Cest la mthode de base de ComposantPassif qui est appele. Elle retourne toujours 0.

Comportement souhaitable
En fonction de la classe du composant pass en paramtre. Appeler la fonction AfficherCaracteristiques de cette classe. Appeler la fonction CalculerImpedance de cette classe.

Introduction la programmation oriente objet avec C++

100

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Appel dune mthode normale


La mthode appele est celle associe au type de la dclaration Cette mthode est choisie au moment de la compilation.

Appel dune mthode virtuelle


La mthode appele est celle associe au type effectif de lobjet pass en paramtre. Cette mthode est choisie au moment de lexcution.

Syntaxe
Pour quune mthode soit virtuelle, il suffit de faire prcder sa dclaration par le mot rserv virtual . En C++, cette dclaration est requise seulement la premire apparition de la mthode (dans la classe de base).
Introduction la programmation oriente objet avec C++ 101

51

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Modification minime de lexemple prcdent


class ComposantPassif { private: string nom; public: void DefinirNom(const string & valeur); string LireNom() const; virtual void AfficherCaracteristiques() const; virtual Complexe CalculerImpedance(double frequence) const; };

Excution conforme aux attentes

Introduction la programmation oriente objet avec C++

102

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Avec la dclaration virtual


La fonction CalculerImpedance appele est celle correspondant au type effectif de lobjet. Idem pour AfficherCaracteristiques.
void AfficherImpedance(const ComposantPassif & composant) { double frequence = 1.0; Complexe impedance; composant.AfficherCaracteristiques(); while (frequence <= 1.0e6) { impedance = composant.CalculerImpedance(frequence); cout << frequence << " Hz : " << impedance << endl; frequence = frequence * 10; } }
Introduction la programmation oriente objet avec C++ 103

52

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme
void AfficherImpedance(const ComposantPassif & composant) { double frequence = 1.0; Complexe impedance; composant.AfficherCaracteristiques(); while (frequence <= 1.0e6) { impedance = composant.CalculerImpedance(frequence); cout << frequence << " Hz : " << impedance << endl; frequence = frequence * 10; } }

La mthode effectivement appele derrire cet appel dpend du type effectif de lobjet. La fonction AfficherImpedance sadapte au type des objets manipuls. Cette fonction peut tre utilise avec diffrents types, elle est dite polymorphe. Le mcanisme utilis sappelle polymorphisme.

Introduction la programmation oriente objet avec C++

104

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Fonctionnement

Une classe avec des mthodes virtuelles


Comporte automatiquement une VMT : Virtual Method Table Cest un tableau contenant ladresse de ses diffrentes mthodes virtuelles

class A { public: long _l; void Test() { } }; class B { public: long _l; virtual void Test() { } }; int main() { cout << "A:" << sizeof(A) << endl; cout << "B:" << sizeof(B) << endl; }

Un objet dune classe avec mthodes virtuelles


Comporte automatiquement un pointeur sur la VMT de sa classe (_vfptr, _vptr, _vmt)
Introduction la programmation oriente objet avec C++

105

53

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Fonctionnement
ComposantPassif VMTComposantPassif* __vmt;
VMTComposant

Resistance VMTComposantPassif* __vmt;

Inductance VMTComposantPassif* __vmt;

VMTInductance

VMTResistance

Introduction la programmation oriente objet avec C++

106

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Fonctionnement

Appel dune mthode virtuelle


On accde la VMT de la classe grce au champs cach _vmt. On trouve ladresse de la mthode dans la VMT par position
Chaque mthode correspond une position fixe Ex : VMT[0] : AfficherCaracteristiques

On appelle la mthode se trouvant cette adresse

Cot
Performances : 1 indirection, donc peu dimpact Mmoire :
Tables VMT rptes pour chaque classe. Code plus volumineux Problmatique dans des environnements extrmement contraints.

Introduction la programmation oriente objet avec C++

107

54

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme - Fonctionnement

Observation avec le debugger visual studio.


Inductance l1, l2; Condensateur c1, c2; Resistance r1, r2;

Introduction la programmation oriente objet avec C++

108

Programmation oriente objet en C++


Les mthodes virtuelles et le polymorphisme

Classe ComposantPassif
La dclaration de la mthode CalculerImpedance est requise pour permettre son appel sur les objets de ce type. Son implmentation retournant toujours 0 est inutile. Le seul intrt est de dclarer l interface commune de la classe Composant Passif et de ses sous-classes.

Mthode virtuelle pure (abstraite)


Il est possible de dclarer la mthode sans limplmenter. Elle est alors dite virtuelle pure ou abstraite. Il faut terminer la dclaration par =0 .

Exemple
virtual Complexe CalculerImpedance(double frequence) const =0;
Introduction la programmation oriente objet avec C++ 109

55

Programmation oriente objet en C++


Polymorphisme avec des paramtres par adresse ou par rfrence

Passage par adresse ou par rfrence


void AfficherImpedance(const ComposantPassif & composant);

La fonction reoit ladresse du paramtre effectif. Permet daller consulter sa classe et dappeler la bonne mthode virtuelle.

Passage par valeur


void AfficherImpedance(const ComposantPassif composant);

La fonction reoit une copie du paramtre effectif. La copie est toujours de type ComposantPassif, pas du type effectif. Seules les mthodes de ComposantPassif seront appeles. Le mcanisme des mthodes virtuelles ne fonctionne pas !

Introduction la programmation oriente objet avec C++

110

Programmation oriente objet en C++


Une 3me classe de visibilit

Rappel
public
Mthodes et attributs utilisables depuis lextrieur de la classe.

private
Mthodes et attributs utilisables depuis lintrieur de la classe.

Classe de visibilit supplmentaire


protected : mthode et attributs utilisables
Depuis lintrieur de la classe. Depuis lintrieur des sous classes.

Introduction la programmation oriente objet avec C++

111

56

Programmation oriente objet en C++


Polymorphisme avec des listes dobjet

Possibilit de construire des listes dobjets polymorphes


Liste contenant des pointeurs sur des objets de diffrents types.

Exemple : liste de pointeurs sur ComposantPassif


Liste de ComposantPassif *

Resistance Condensateur Resistance Condensateur Resistance

Inductance

Condensateur

Inductance

Condensateur

Introduction la programmation oriente objet avec C++

112

Programmation oriente objet en C++


Signification conceptuelle de lhritage

Quand est-il juste dutiliser un hritage ?


Si on peut dire de la sous-classe EST UN par rapport son parent
ComposantPassif + + + nom: string DefinirNom(st ring) : void LireNom() : string AfficherCaracteristiques() : void

Resis tance + resistance : double CalculerImpedance(double) : Complexe +

Induc tance inductance : double CalculerImpedance(double) : Complexe +

Condensateur capacite: double CalculerImpedance(double) : Complexe

Introduction la programmation oriente objet avec C++

113

57

Programmation oriente objet en C++


Principes de conception logicielle oriente objet

Que signifie classe ?


Classe = ensemble dobjets. Terme issu du domaine de la Classification . Sous-classe = sous-ensemble.
ComposantPassif + + + nom: string DefinirNom(st ring) : void LireNom() : string AfficherCaracteristiques() : void

Composant passif

Rsistance

Inductance

Resis tance + resistance : double CalculerImpedance(double) : Complexe +

Induc tance inductance : double CalculerImpedance(double) : Complexe +

Condensateur capacite: double CalculerImpedance(double) : Complexe

Condensateur

Introduction la programmation oriente objet avec C++

114

Programmation oriente objet en C++


Principes de conception logicielle oriente objet - UML

Conception oriente objet :


Dcoupage dun problme complexe en familles dobjets. Notion dobjet : identit, tat, comportement. Notion assez intuitive.
Vg tal

EtreV iv ant

Ani mal

Caractristique des logiciels conus selon une approche Oriente Objet


Rsistent assez bien aux changements de spcifications. Aisment extensibles. Meilleure prennit.
Introduction la programmation oriente objet avec C++

Vertbrs

Inv er tbr

Mamifres

Hum ain

115

58

Le langage C++
Concepts avancs la gnricit - introduction

Exemple des classes de gestion de liste


ListeDouble, ListeInt, ListeChar, ListComposantPassif, Le code est strictement identique. Seul le type des lments change.

Comment viter de rpter le code pour chaque type ? C++ supporte la gnricit
Possibilit dcrire des classes et fonctions. Dont limplmentation est paramtre par le type.

Exemple
List<double> List<int>
Introduction la programmation oriente objet avec C++ 116

Le langage C++
Concepts avancs la gnricit dclaration dune classe gnrique
template <class ElementType, int Size> class List { public: List(); ElementType & operator[](int index); int GetSize() const { return Size; } int GetCount() const; int Add(const ElementType & value); void Clear(); void RemoveAt(int index); void Insert(int index, const ElementType & value); private: ElementType _elements[Size]; int _count; };

Particularit
La dfinition des mthodes doit aussi tre visible lors de lutilisation de la classe gnrique En gnral, plac aussi dans le .h
Introduction la programmation oriente objet avec C++ 117

59

Le langage C++
Concepts avancs la gnricit implmentation
template <class ElementType, int Size> void List<ElementType, Size>::RemoveAt(int index) { if (index >= 0 && index < _count) { for (int i = index + 1 ; i < _count; i++) _elements[i - 1] = _elements[i]; _count = count - 1; } else throw Exception("Invalid index"); }

Remarques
Une classe gnrique est appele template ou patron . Cest un moule paramtr permettant de gnrer des classes. La gnricit peut aussi sappliquer aux fonctions.

Introduction la programmation oriente objet avec C++

118

Le langage C++
Concepts avancs la gnricit utilisation
List<double, 100> liste1; List<int, 100> liste2; liste1.Add(2.3); liste2.Add(10);

Introduction la programmation oriente objet avec C++

119

60

Le langage C++
Concepts avancs la stl

Le C++ est livr avec une bibliothque de templates


Stl : Standard Template Library. Avantages
Comporte de nombreux conteneurs et algorithmes.

Inconvnients
Utilisation peu intuitive au dbut. Pas facile tendre. Utilise lallocation dynamique de mmoire. Difficilement utilisable dans les environnements temps rel.

Introduction la programmation oriente objet avec C++

120

Le langage C++
Concepts avancs la stl - exemple
#include <iostream> #include <vector> using namespace std; int main() { vector<double> v; v.push_back(1.1); v.push_back(2.2); v.push_back(3.3); cout << "Taille: " << v.size() << endl; cout << "Element[1]:" << v[1] << endl; cout << "Boucle sur les elements:" << endl; int i; for(i=0; i < v.size(); i++) cout << v[i] << endl; cout << endl << "Iterateur:" << endl; vector<double>::const_iterator it; for(it = v.begin() ; it != v.end() ; it++) cout << *it << endl; }
Introduction la programmation oriente objet avec C++ 121

61

Le langage C++
Concepts avancs la stl aperu du contenu

Introduction la programmation oriente objet avec C++

122

Le langage C++
Bibliothque standard

Bibliothque standard du C++ : assez fournie.


Chanes de caractres. Entres sorties, fichiers. Conteneurs gnriques : Standard Template Library (STL)
Vecteurs, listes, files, piles,

Largement documente

Introduction la programmation oriente objet avec C++

123

62

Quavons-nous appris ?
Les bases du C++
La compilation plus stricte. Les entres sorties. Les espaces de nom. Les types rfrences. Les nouveaux types de donnes. Lallocation dynamique. Les exceptions Notions de classe, dobjet, de mthode. Surcharge doprateurs. Constructeurs, destructeurs. Mthodes virtuelles et polymorphisme. Concepts avancs: la gnricit, la stl.
124

Lorientation objet

Introduction la programmation oriente objet avec C++

Vos questions

Introduction la programmation oriente objet avec C++

125

63

Introduction la programmation oriente objet avec C++

126

64