Vous êtes sur la page 1sur 54

Cours 1

Les classes et les objets

INF1101 Algorithmes et structures de donnes

Plan du cours 2
I. II. III. IV. V. Principe de modlisation oriente objet Dfinition et implmentation d une classe Constructeurs et destructeurs Dtails de C++ Conversion de types

INF1101 Algorithmes et structures de donnes

I - Principe de modlisation oriente objet


    Classe Objet Principe d encapsulation Rutilisation

INF1101 Algorithmes et structures de donnes

Une classe
Un objet possde des attributs (proprits) et des comportements ou des oprations sur ces attributs, ralises par des fonctions membres (on les appelle aussi mthodes) mthodes) On dfinit une classe pour reprsenter un ensemble d'objets ayant les mmes proprits et des comportements communs.

INF1101 Algorithmes et structures de donnes

Une classe
Supposons un logiciel qui doit traiter plusieurs types de cube, tel que une bote 10x5x20, de couleur rouge, ou bien un cube 5x5x5 de couleur orange. Il faut travailler avec plusieurs types de cubes mais qui possdent tous les mmes proprits et les mmes oprations (ou comportements) pour modifier ces proprits.

INF1101 Algorithmes et structures de donnes

Une classe (suite)


Une classe est donc un super type que l on dfinit, une gnralisation d un objet possdant des proprits et des oprations (ou comportements). Dans le langage C++, une classe ressemble une structure que l on dfinirait (struct type_cube) avec des (struct type_cube) mthodes (ou fonctions membres) pouvant modifier les champs de la structure.

Largeur Longueur Hauteur

INF1101 Algorithmes et structures de donnes

Attributs et oprations d une classe


Les proprits d'un objet sont reprsentes l'aide d'attributs. Des valeurs sont associes ces attributs. Exemple : Largueur de Cube1 est 10 Les comportements d'un objet sont reprsents l'aide de fonctions membres (mthodes). Une fonction membre est une action ou une transformation qui peut tre effectue sur un objet ou par un objet Exemple : Pour effectuer un dplacement, objet. il est ncessaire de faire translater le cube.
INF1101 Algorithmes et structures de donnes 7

Reprsentation d une classe

Nom de la classe Listes des attributs attribut: type Listes des fonctions membres fonction(arguments): valeur retourne

Cube Largeur: double Longueur: double Hauteur: double

setCouleur ( Couleur ) setTaille (haut, larg, long )

INF1101 Algorithmes et structures de donnes

Un objet
Exemple: Exemple: Un rectangle 5x10x20 est un objet de classe Cube et un Cube 5x5x5 est un autre objet de la classe Cube. Un objet est donc une instanciation d une classe. Cet objet possde tous les attributs et toutes les fonctions membres de la classe, mais avec des valeurs d attributs propres l objet.

INF1101 Algorithmes et structures de donnes

Un objet (suite)
Une fois qu une classe Cube a t dfinie, il est possible d instancier des objets de la classe Cube, qui possderont des attributs associs des valeurs. rectangle Largeur = 5 auteur = 10 ChangerCouleur

INF1101 Algorithmes et structures de donnes

10

Reprsentation d'une instance


La classe Nom de l objet

Cube unCube;
(Cube) auteur = 5 Longueur = 5 Largeur = 5

Valeurs par dfaut


INF1101 Algorithmes et structures de donnes 11

Programmation par objets


Principe d encapsulation (masquage des donnes) Types de donnes abstraits ( classe indpendante de son implmentation). L implmentation de classe implmentation). peut changer et le client est toujours fonctionnel. Rutilisation, rutilisation, rutilisation Rutilisation: agrgation, hritage, gnralisation.

INF1101 Algorithmes et structures de donnes

12

Principe d encapsulation
Les valeurs des attributs peuvent tre changes seulement par les mthodes fournies avec l'objet. L'tat de l'objet ne peut tre modifi directement par le client. Changer Taille Les oprations pour afficher les valeurs des attributs pour le client

Translater Changer Couleur


Largeur Longueur Hauteur Couleur

Rotation

crire Info

INF1101 Algorithmes et structures de donnes

13

La rutilisation
ritage
La rutilisation est une notion omniprsente dans le langage C++, car il est possible d utiliser une classe d un certain contexte pour la redfinir dans un autre contexte en effectuant un hritage

INF1101 Algorithmes et structures de donnes

14

II - Dfinition et implmentation

d une classe
Classe Attributs Fonctions membres Double inclusion du fichier d entte Paramtres par dfaut des fonctions Inline Principe d encapsulation et abstraction des donnes donnes

INF1101 Algorithmes et structures de donnes

15

Classe
En C++, la dfinition d une classe dbute toujours en spcifiant class, suivie du nom de la classe. class, Toute l interface de la classe, c est--dire les attributs et estles signatures (entte) de fonctions, est contenue entre des accolades. La dfinition d une classe se situe TOUJOURS dans un fichier entte (ex: cube.h)
Exemple: class Cube { (. . . Dfinition) }; Note: ne pas oublier le ; aprs la deuxime accolade. aprs
INF1101 Algorithmes et structures de donnes 16

Interface et implmentation d une classe


L implmentation de la classe reprsente la dfinition des fonctions membres. (fichier.cpp) L interface d une classe reprsente les comportements ou les fonctions membres disponibles aux clients ( fichier.h).

INF1101 Algorithmes et structures de donnes

17

Attributs
Les attributs d une classe sont des variables ou des pointeurs, mais qui ne seront gnralement accessibles que par les fonctions membres de la classe. Principe d encapsulation. D aucune faon les attributs pourront tre modifis ou accds l extrieur de la classe (ex: partir du main()). main()). Ils seront accessibles l aide des fonctions membres. Pour les protger, on indique que les attributs seront classifis private. private.
INF1101 Algorithmes et structures de donnes 18

Attributs (suite)
Pour la classe Cube, on a:
RFRENCE: cube.h

class Cube { private: int Largeur; int Longeur; int Hauteur; Couleur maCouleur; . . . };

INF1101 Algorithmes et structures de donnes

19

Attributs (suite)
Cependant, le compilateur dclarera les attributs private par dfaut (mais c est une bonne habitude de toujours le spcifier explicitement):
class Cube { int Largeur; int Longeur; int Hauteur; Couleur maCouleur; . . . };

INF1101 Algorithmes et structures de donnes

20

Fonctions membres
Afin de pouvoir manipuler les attributs d une classe, nous avons recours aux fonctions membres qui permettent de retourner ou modifier la valeur d un ou des attributs. Les fonctions membres qui seront accessibles au client de la classe seront signales par : public De ce fait mme, les fonctions membres qui n ont aucune utilit l extrieur de la classe mais qui seront utilises uniquement par la classe peuvent tre regroupes dans la section private
INF1101 Algorithmes et structures de donnes 21

Fonctions membres (suite)


Pour la classe Cube, on a :
class Cube { public: void setTaille(float la, float lo, float ha); void setCouleur(const couleur &uneCouleur); void setTransformation(const transf &uneTransformation); void getTaille(float &la, float &lo, float &ha) const; Couleur getCouleur() const; ... private: int Largeur; int Longeur; int Hauteur; Couleur maCouleur;
... }; INF1101 Algorithmes et structures de donnes 22

Implmentation d une fonction membre


La dfinition de la classe est situe dans le fichier .h de la classe, toutes les implmentations des fonctions membres d une classe se situent dans le fichier .cpp de la classe (ex: moteur.cpp). L implmentation d une classe devrait TOUJOURS tre dans un fichier .cpp (ex: cube.cpp) et avoir le mme nom que la classe. La nomenclature utiliser pour identifier une fonction membre d une classe dans le fichier .cpp est:
[Type de retour de la fonction] [Nom de classe]::[Nom de la fonction] [Type fonction] (Paramtres de la fontion) { Implmentation de la fonction . . .}
INF1101 Algorithmes et structures de donnes 23

Exemple d implmentation d une fonction membre


Dans la classe Cube, on retrouverait dans le fichier Cube.cpp l implmentation de la fonction membre setTaille() :
void Cube::setTaille(float uneLargeur, float uneLongueur, Cube::setTaille(float float uneHauteur) { maLargeur = uneLargeur; maLongueur = uneLongueur; maHauteur = uneHauteur; }

INF1101 Algorithmes et structures de donnes

24

Double inclusion du fichier d entte : problmatique


Problmatique: En compilant tout le programme, le compilateur passera travers tous les fichiers squentiellement. Cependant, si le compilateur passe deux fois travers un fichier .h contenant la dfinition d une classe, ce dernier indiquera une erreur de redfinition. Comment faire pour que le compilateur ne passe qu une seule fois travers la dfinition d une classe afin d viter la redfinition? redfinition?

INF1101 Algorithmes et structures de donnes

25

Double inclusion du fichier d entte : solution


Solution: #ifndef CUBE_H #define CUBE_H class Cube { . . . }; #endif

INF1101 Algorithmes et structures de donnes

26

Double inclusion du fichier d entte : explications


La premire fois que le compilateur passe travers le fichier cube.h premire pour compiler la dfinition (ou l interface) de la classe Cube: 1) #ifndef CUBE_H : Est ce que le mot CUBE_H a t le dfini? Non. dfini? 2) Alors, #define CUBE_H : Dfinir le mot CUBE_H 3) #endif : Termine la dfinition dfinition La deuxime fois que le compilateur passe travers le fichier cube.h pour compiler la dfinition (ou l interface) de la classe Cube: 1) #ifndef CUBE_H Est ce que le mot CUBE_H a t le dfini? Oui. dfini? 2) Alors, sort du fichier.
INF1101 Algorithmes et structures de donnes 27

Exemple double inclusion du fichier d entte


Vrifiez le problme de la double inclusion en mettant en commentaire dans le fichier cube.h:
#ifndef CUBE_H, #define CUBE_H et #endif

Compilez tout le programme, et observez l erreur:


error C2011: 'Cube' : 'class' type redefinition Cube.cpp

Le compilateur indique cette erreur puisque le fichier Cube.h est inclus dans voiture.h et dans main.cpp. Ainsi, le compilateur passe deux fois dans le fichier Cube.h, et puisque que les enttes de double inclusion ont t retires, il y a redfinition de la classe Cube.
INF1101 Algorithmes et structures de donnes 28

Paramtres par dfaut des fonctions


Les signatures des fonctions recevant des paramtres peuvent possder des valeurs de dfaut si aucun paramtre n est envoy lors de l appel de la fonction. Les valeurs par dfaut des paramtres doivent se trouver seulement dans la dclaration des fonctions membres de l interface de la classe et non pas dans l implmentation de la fonction membre.
INF1101 Algorithmes et structures de donnes 29

Paramtres par dfaut des fonctions (suite)


Exemple: Exemple:
RFRENCE: Cube.h, Cube( )

void setTaille2(float uneLargeur=5, float uneLongueur=5, float uneHauteur=5); uneHauteur=5);

Si setTaille2() est appele sans paramtres, la fonction setTaille2() recevra des paramtres avec les valeurs de dfaut.
Cube C2; C2.setTaille2(); C2.setTaille2(2,6); C2.setTaille2(2); C2.setTaille2(2); // Impossible de faire M2.SetValvesCylindre(,6);

INF1101 Algorithmes et structures de donnes

30

III - Constructeurs et

destructeurs
Constructeurs par dfaut et par paramtres Constructeur de recopie Destructeurs New d un objet (constructeur)

INF1101 Algorithmes et structures de donnes

31

Le constructeur
Le constructeur est une fonction membre publique appele implicitement lors de la cration d un objet. Pour un tableau d objet, le constructeur par dfaut est appel pour chaque lment du tableau. Le constructeur sert initialiser un objet lors de sa cration.
INF1101 Algorithmes et structures de donnes 32

Constructeurs par dfaut


Un constructeur par dfaut : Constructeur ne recevant aucun paramtre.
RFRENCE: cube.cpp,

Cube::Cube() { maLargeur = 0; maLongueur = 0; maHauteur = 0; }

INF1101 Algorithmes et structures de donnes

33

Constructeurs par paramtres


Un constructeur par paramtres est un constructeur recevant des paramtres afin d initialiser les attributs de l objet selon les valeurs des arguments reus. Contrairement au constructeur par dfaut, une classe peut possder plusieurs constructeurs par paramtres, ayant tous des signatures diffrentes.
INF1101 Algorithmes et structures de donnes 34

Constructeurs par paramtres


RFRENCE: cube.cpp
Cube::Cube(float uneLargeur, float uneLongueur, float uneHauteur) { maLargeur = uneLargeur; maLongueur = uneLongueur; maHauteur = uneHauteur; }

INF1101 Algorithmes et structures de donnes

35

Constructeurs par dfaut et paramtres


Note: Note: il ne peut jamais coexister dans une classe un constructeur par dfaut sans paramtres et un constructeur par dfaut avec des paramtres possdant des valeurs de dfaut. Il ne peut y avoir qu un seul constructeur par dfaut. Il y aurait une ambigut lors de l appel d un constructeur, le compilateur ne sachant pas quel constructeur appeler.
INF1101 Algorithmes et structures de donnes 36

Constructeurs par dfaut et par paramtres (suite)


Un constructeur par dfaut et par paramtres : Constructeur possdant des paramtres avec des valeurs de dfaut.
RFRENCE: couleur.h class Couleur { public: Couleur(float r=0, float g=0, float b=0) ; . . . private: float rouge; float vert; float bleu; }
INF1101 Algorithmes et structures de donnes 37

Constructeurs par dfaut et par paramtres (suite)


Faire une dmonstration de l ambiguit. Il n y aura pas d ambiguit tant que l on ne dclare pas d objets (seulement un warning).

INF1101 Algorithmes et structures de donnes

38

Passage par rfrence rfrence


 En ajoutant un & devant le paramtre reu, ceci indique qu une rfrence paramtre l adresse est transmise, et donc en modifiant la valeur du paramtre dans la fonction, la modification sera conserve la sortie de la fonction.
void agrandirX2(image & img) //img change de valeur { /*--/*--- modification de l'image transmise a la fonction ----*/ ----*/ img.bitmap = imgX2.bitmap; img.largeur = imgX2.largeur; img.hauteur = imgX2.hauteur; . . .

INF1101 Algorithmes et structures de donnes

39

Schmatisation du passage par rfrence


lImage image img
void agrandirX2(image & img) agrandirX2(image img) {

L objet reoit temporairement un nouveau nom qui sera utilis par la fonction

(..) }

INF1101 Algorithmes et structures de donnes

40

Passage par valeur


Contrairement la transmission par rfrence, la transmission par valeur fait une copie temporaire de la variable dans la fonction, et donc une modification de la variable ne sera pas conserve la sortie de la fonction, puisque la modification a t faite sur une variable temporaire.
void agrandirX3(image img) { /*--/*--- modification de l'image transmise a la fonction ----*/ ----*/ img.bitmap = imgX2.bitmap; img.largeur = imgX2.largeur; img.hauteur = imgX2.hauteur; // <- img RECU EN VALEUR, <NE CHANGERA PAS! }

INF1101 Algorithmes et structures de donnes

41

Schmatisation du passage par valeur


lImage image=

Le contenu de lImage est copi dans le paramtre img

void agrandirX3(image img) agrandirX3(image img) { (..) }

image=

img

INF1101 Algorithmes et structures de donnes

42

Constructeur de recopie
Un constructeur qui sert crer un objet identique l objet reu en paramtre. Chaque attribut de l objet en construction est initialis selon les valeurs des attributs de l objet copier.

INF1101 Algorithmes et structures de donnes

43

Exemple d un constructeur de recopie


RFRENCE: cube.cpp Cube::Cube(const Cube &copie) : maCouleur( copie.maCouleur ), maTransformation( copie.maTransformation) { maLargeur = copie.maLargeur; maLongueur = copie.maLongueur; maHauteur = copie.maHauteur; }

INF1101 Algorithmes et structures de donnes

44

Appel du constructeur de recopie


Le constructeur de recopie est appel lorsqu on doit crer une instance d un objet qui est la copie d un autre objet. Le constructeur de recopie est toujours appel lorsqu un objet est envoy par valeur une autre fonction. La fonction crera une copie temporaire de l objet pour les fins de la fonction. Il est aussi appel lorsqu une fonction retourne un objet (attention: le constructeur de recopie n est pas appel lorsqu une fonction retourne une rfrence un objet).
INF1101 Algorithmes et structures de donnes 45

Destructeurs
Le destructeur est une fonction membre publique appele implicitement lors de la destruction d un objet. Les destructeurs sont appels dans l ordre inverse des constructeurs. La fonction principale d un destructeur rside dans la dsallocation de mmoire dynamique qui a t alloue par le constructeur.

INF1101 Algorithmes et structures de donnes

46

Destructeurs (suite)
RFRENCE: sphere.h class Sphere { public: Sphere(); Sphere(float unRayon, char* unNom); Sphere(const sphere &copie); ~Sphere(); . . . private: float char* Couleur Translation Rotation

Destructeur
monRayon; monNom; maCouleur; maPosition; monAngle;

static unsigned int nbSphere; };


INF1101 Algorithmes et structures de donnes 47

Destructeurs (suite)
Constructeur de sphere :
Sphere::Sphere() : monRayon( 0 ), maCouleur( ), maTransformation( ) { nbSphere++; monNom = new char[30]; }

Destructeur de sphere :
Sphere::~Sphere() { nbSphere--; nbSphere--; if(monNom) delete []monNom; }

INF1101 Algorithmes et structures de donnes

48

Constructeur et destructeur
Une classe a toujours automatiquement un constructeur par dfaut, un constructeur de recopie et un destructeur sans qu il soit ncessaire de les crire. Le constructeur de recopie implicite fait une copie attribut par attribut.

INF1101 Algorithmes et structures de donnes

49

New d un objet (constructeur)


L allocation dynamique permet la cration d un objet ou d un vecteur d objets. Voir exemple sur les new

INF1101 Algorithmes et structures de donnes

50

Vecteurs
Utilisation de la classe vector de la librairie STL pour une gestion plus facile et efficace. La classe vector est une classe gnrique, c est--dire une classe qui permet de stocker n importe quel type d objet. Inclusion de la librairie: #include <vector> Dclaration en spcifiant le nom du vecteur et le type d lments conserver: Ex: vector<int> lesEntiers;
INF1101 Algorithmes et structures de donnes 51

Manipulation d un vecteur
Redimensionnement d un vecteur : vector<image> Im; Im.resize(9); Accs une position avec l oprateur [ ] : image UneIm=Im[4];

Il est aussi possible de retirer tout les lements d un vecteur :


Im.clear();

Rcuprer le nombre d lments d un vecteur avec la fonction size() :


Im.size();

INF1101 Algorithmes et structures de donnes

52

Utilisation d un string
Inclusion de la librairie: #include <string> Dclaration en spcifiant le nom de la chane Ex: string c_chaine; La classe string gre toute manipulation d une chane de caractres, tel que la copie (=), La concatnation (+=), L accs un caractre ([]) et ([]) La taille de la chane (.size() ).
INF1101 Algorithmes et structures de donnes 53

Utilisation d un string
Exemple:
c_chaine=Bonjour; c_chaine=Bonjour; c_chaine+= le monde; c_chaine[c_chaine.size()c_chaine[c_chaine.size()-1]=s;

INF1101 Algorithmes et structures de donnes

54