Cours 1

Les classes et les objets

INF1101 Algorithmes et structures de données

1

Plan du cours 2
I. II. III. IV. V. Principe de modélisation orientée objet Définition et implémentation d une classe Constructeurs et destructeurs Détails de C++ Conversion de types

INF1101 Algorithmes et structures de données

2

I - Principe de modélisation orientée objet 
   Classe Objet Principe d encapsulation Réutilisation

INF1101 Algorithmes et structures de données

3

Une classe
Un objet possède des attributs (propriétés) et des comportements ou des opérations sur ces attributs, réalisées par des fonctions membres (on les appelle aussi méthodes) méthodes) On définit une classe pour représenter un ensemble d'objets ayant les mêmes propriétés et des comportements communs.

INF1101 Algorithmes et structures de données

4

Une classe
Supposons un logiciel qui doit traiter plusieurs types de cube, tel que une boîte 10x5x20, de couleur rouge, ou bien un cube 5x5x5 de couleur orange. Il faut travailler avec plusieurs types de cubes mais qui possèdent tous les mêmes propriétés et les mêmes opérations (ou comportements) pour modifier ces propriétés.

INF1101 Algorithmes et structures de données

5

Une classe (suite) Une classe est donc un « super » type que l on définit. Dans le langage C++. Largeur Longueur Hauteur INF1101 Algorithmes et structures de données 6 . une généralisation d un objet possédant des propriétés et des opérations (ou comportements). une classe ressemble à une structure que l on définirait (struct type_cube) avec des (struct type_cube) méthodes (ou fonctions membres) pouvant modifier les champs de la structure.

Une fonction membre est une action ou une transformation qui peut être effectuée sur un objet ou par un objet Exemple : Pour effectuer un déplacement. Exemple : Largueur de Cube1 est 10 Les comportements d'un objet sont représentés à l'aide de fonctions membres (méthodes). INF1101 Algorithmes et structures de données 7 . objet. Des valeurs sont associées à ces attributs.Attributs et opérations d une classe Les propriétés d'un objet sont représentées à l'aide d'attributs. il est nécessaire de faire translater le cube.

long ) INF1101 Algorithmes et structures de données 8 .Représentation d une classe Nom de la classe Listes des attributs attribut: type Listes des fonctions membres fonction(arguments): valeur retournée Cube Largeur: double Longueur: double Hauteur: double setCouleur ( Couleur ) setTaille (haut. larg.

mais avec des valeurs d attributs propres à l objet. Cet objet possède tous les attributs et toutes les fonctions membres de la classe. Un objet est donc une instanciation d une classe.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. INF1101 Algorithmes et structures de données 9 .

qui posséderont des attributs associés à des valeurs. rectangle Largeur = 5 auteur = 10 ChangerCouleur INF1101 Algorithmes et structures de données 10 .Un objet (suite) Une fois qu une classe Cube a été définie. il est possible d instancier des objets de la classe Cube.

(Cube) auteur = 5 Longueur = 5 Largeur = 5 Valeurs par défaut INF1101 Algorithmes et structures de données 11 .Représentation d'une instance La classe Nom de l objet Cube unCube.

INF1101 Algorithmes et structures de données 12 . réutilisation. peut changer et le client est toujours fonctionnel.Programmation par objets Principe d encapsulation (masquage des données) Types de données abstraits ( classe indépendante de son implémentation). réutilisation Réutilisation: agrégation. Réutilisation. héritage. généralisation. L implémentation de classe implémentation).

Changer Taille Les opérations pour afficher les valeurs des attributs pour le client Translater Changer Couleur Largeur Longueur Hauteur Couleur Rotation Écrire Info INF1101 Algorithmes et structures de données 13 . L'état de l'objet ne peut être modifié directement par le client.Principe d encapsulation Les valeurs des attributs peuvent être changées seulement par les méthodes fournies avec l'objet.

car il est possible d utiliser une classe d un certain contexte pour la redéfinir dans un autre contexte en effectuant un héritage INF1101 Algorithmes et structures de données 14 .La réutilisation éritage La réutilisation est une notion omniprésente dans le langage C++.

II .Définition et implémentation d une classe Classe Attributs Fonctions membres Double inclusion du fichier d entête Paramètres par défaut des fonctions Inline Principe d encapsulation et abstraction des données données INF1101 Algorithmes et structures de données 15 .

suivie du nom de la classe. après INF1101 Algorithmes et structures de données 16 . est contenue entre des accolades. Note: ne pas oublier le . la définition d une classe débute toujours en spécifiant class. class. c est-à-dire les attributs et estles signatures (entête) de fonctions. . . Définition) }. La définition d une classe se situe TOUJOURS dans un fichier entête (ex: cube. Toute l interface de la classe. après la deuxième accolade.h) Exemple: class Cube { (.Classe En C++.

Interface et implémentation d une classe L implémentation de la classe représente la définition des fonctions membres. INF1101 Algorithmes et structures de données 17 . (fichier.h).cpp) L interface d une classe représente les comportements ou les fonctions membres disponibles aux clients ( fichier.

private.Attributs Les attributs d une classe sont des variables ou des pointeurs. Principe d encapsulation. main()). D aucune façon les attributs pourront être modifiés ou accédés à l extérieur de la classe (ex: à partir du main()). INF1101 Algorithmes et structures de données 18 . Ils seront accessibles à l aide des fonctions membres. Pour les protéger. mais qui ne seront généralement accessibles que par les fonctions membres de la classe. on indique que les attributs seront classifiés private.

INF1101 Algorithmes et structures de données 19 . on a: RÉFÉRENCE: cube. .h class Cube { private: int Largeur.Attributs (suite) Pour la classe Cube. }. int Longeur. . int Hauteur. Couleur maCouleur. .

Attributs (suite) Cependant. }. . . Couleur maCouleur. le compilateur déclarera les attributs private par défaut (mais c est une bonne habitude de toujours le spécifier explicitement): class Cube { int Largeur. INF1101 Algorithmes et structures de données 20 . int Hauteur. int Longeur. .

nous avons recours aux fonctions membres qui permettent de retourner ou modifier la valeur d un ou des attributs. les fonctions membres qui n ont aucune utilité à l extérieur de la classe mais qui seront utilisées uniquement par la classe peuvent être regroupées dans la section private INF1101 Algorithmes et structures de données 21 .Fonctions membres Afin de pouvoir manipuler les attributs d une classe. Les fonctions membres qui seront accessibles au client de la classe seront signalées par : public De ce fait même.

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

.h de la classe. La nomenclature à utiliser pour identifier une fonction membre d une classe dans le fichier .Implémentation d une fonction membre La définition de la classe est située dans le fichier .cpp de la classe (ex: moteur.cpp est: [Type de retour de la fonction] [Nom de classe]::[Nom de la fonction] [Type fonction] (Paramètres de la fontion) { Implémentation de la fonction . .} INF1101 Algorithmes et structures de données 23 . L implémentation d une classe devrait TOUJOURS être dans un fichier . toutes les implémentations des fonctions membres d une classe se situent dans le fichier .cpp) et avoir le même nom que la classe.cpp).cpp (ex: cube.

cpp l implémentation de la fonction membre setTaille() : void Cube::setTaille(float uneLargeur.Exemple d implémentation d une fonction membre Dans la classe Cube. } INF1101 Algorithmes et structures de données 24 . Cube::setTaille(float float uneHauteur) { maLargeur = uneLargeur. maLongueur = uneLongueur. maHauteur = uneHauteur. on retrouverait dans le fichier Cube. float uneLongueur.

Cependant.h contenant la définition d une classe. si le compilateur passe deux fois à travers un fichier . le compilateur passera à travers tous les fichiers séquentiellement.Double inclusion du fichier d entête : problématique Problématique: En compilant tout le programme. ce dernier indiquera une erreur de redéfinition. Comment faire pour que le compilateur ne passe qu une seule fois à travers la définition d une classe afin d éviter la redéfinition? redéfinition? INF1101 Algorithmes et structures de données 25 .

. }. .Double inclusion du fichier d entête : solution Solution: #ifndef CUBE_H #define CUBE_H class Cube { . #endif INF1101 Algorithmes et structures de données 26 .

h première pour compiler la définition (ou l interface) de la classe Cube: 1) #ifndef CUBE_H : Est ce que le mot CUBE_H a été le défini? Non. sort du fichier. défini? 2) Alors. défini? 2) Alors. INF1101 Algorithmes et structures de données 27 .h pour compiler la définition (ou l interface) de la classe Cube: 1) #ifndef CUBE_H Est ce que le mot CUBE_H a été le défini? Oui. #define CUBE_H : Définir le mot CUBE_H 3) #endif : Termine la définition définition La deuxième fois que le compilateur passe à travers le fichier cube.Double inclusion du fichier d entête : explications La première fois que le compilateur passe à travers le fichier cube.

h et dans main.Exemple double inclusion du fichier d entête Vérifiez le problème de la double inclusion en mettant en commentaire dans le fichier cube.h. le compilateur passe deux fois dans le fichier Cube. #define CUBE_H et #endif Compilez tout le programme.h: #ifndef CUBE_H. Ainsi. et puisque que les entêtes de double inclusion ont été retirées.cpp.cpp Le compilateur indique cette erreur puisque le fichier Cube. INF1101 Algorithmes et structures de données 28 .h est inclus dans voiture. et observez l erreur: error C2011: 'Cube' : 'class' type redefinition Cube. il y a redéfinition de la classe Cube.

INF1101 Algorithmes et structures de données 29 . Les valeurs par défaut des paramètres doivent se trouver seulement dans la déclaration des fonctions membres de l interface de la classe et non pas dans l implémentation de la fonction membre.Paramètres par défaut des fonctions Les signatures des fonctions recevant des paramètres peuvent posséder des valeurs de défaut si aucun paramètre n est envoyé lors de l appel de la fonction.

6). C2.6). uneHauteur=5).setTaille2(). Cube C2. float uneLongueur=5.h. // Impossible de faire M2.Paramètres par défaut des fonctions (suite) Exemple: Exemple: RÉFÉRENCE: Cube. C2.SetValvesCylindre(. C2. INF1101 Algorithmes et structures de données 30 . Si setTaille2() est appelée sans paramètres. la fonction setTaille2() recevra des paramètres avec les valeurs de défaut. float uneHauteur=5).setTaille2(2.setTaille2(2). Cube( ) void setTaille2(float uneLargeur=5. C2.setTaille2(2).

Constructeurs et destructeurs Constructeurs par défaut et par paramètres Constructeur de recopie Destructeurs New d un objet (constructeur) INF1101 Algorithmes et structures de données 31 .III .

le constructeur par défaut est appelé pour chaque élément du tableau. Le constructeur sert à initialiser un objet lors de sa création. Pour un tableau d objet. INF1101 Algorithmes et structures de données 32 .Le constructeur Le constructeur est une fonction membre publique appelée implicitement lors de la création d un objet.

Constructeurs par défaut Un constructeur par défaut : Constructeur ne recevant aucun paramètre. maHauteur = 0. RÉFÉRENCE: cube. } INF1101 Algorithmes et structures de données 33 . Cube::Cube() { maLargeur = 0. maLongueur = 0.cpp.

ayant tous des signatures différentes. une classe peut posséder plusieurs constructeurs par paramètres.Constructeurs par paramètres Un constructeur par paramètres est un constructeur recevant des paramètres afin d initialiser les attributs de l objet selon les valeurs des arguments reçus. Contrairement au constructeur par défaut. INF1101 Algorithmes et structures de données 34 .

cpp Cube::Cube(float uneLargeur. } INF1101 Algorithmes et structures de données 35 . float uneLongueur. float uneHauteur) { maLargeur = uneLargeur.Constructeurs par paramètres RÉFÉRENCE: cube. maHauteur = uneHauteur. maLongueur = uneLongueur.

INF1101 Algorithmes et structures de données 36 . Il y aurait une ambiguïté lors de l appel d un constructeur. Il ne peut y avoir qu un seul constructeur par défaut. le compilateur ne sachant pas quel constructeur appeler.Constructeurs par défaut et paramètres Note: Note: il ne peut jamais coexister dans une classe un constructeur par défaut sans paramètres et un constructeur par défaut avec des paramètres possédant des valeurs de défaut.

float bleu. float b=0) .h class Couleur { public: Couleur(float r=0.Constructeurs par défaut et par paramètres (suite) Un constructeur par défaut et par paramètres : Constructeur possédant des paramètres avec des valeurs de défaut. . float g=0. float vert. . . RÉFÉRENCE: couleur. private: float rouge. } INF1101 Algorithmes et structures de données 37 .

INF1101 Algorithmes et structures de données 38 . Il n y aura pas d ambiguité tant que l on ne déclare pas d objets (seulement un warning).Constructeurs par défaut et par paramètres (suite) Faire une démonstration de l ambiguité.

img.modification de l'image transmise a la fonction ----*/ ----*/ img.hauteur = imgX2. void agrandirX2(image & img) //img change de valeur { /*--/*--. et donc en modifiant la valeur du paramètre dans la fonction.bitmap. . ceci indique qu une référence paramètre à l adresse est transmise.largeur. img.bitmap = imgX2.Passage par référence référence  En ajoutant un & devant le paramètre reçu.largeur = imgX2. INF1101 Algorithmes et structures de données 39 .hauteur. la modification sera conservée à la sortie de la fonction. . .

) } INF1101 Algorithmes et structures de données 40 .Schématisation du passage par référence lImage image img void agrandirX2(image & img) agrandirX2(image img) { L objet reçoit temporairement un nouveau nom qui sera utilisé par la fonction (..

et donc une modification de la variable ne sera pas conservée à la sortie de la fonction.hauteur. // <.bitmap.modification de l'image transmise a la fonction ----*/ ----*/ img.bitmap = imgX2.Passage par valeur Contrairement à la transmission par référence. la transmission par valeur fait une copie temporaire de la variable dans la fonction.largeur = imgX2.largeur. img. img. <NE CHANGERA PAS! } INF1101 Algorithmes et structures de données 41 .hauteur = imgX2. puisque la modification a été faite sur une variable temporaire. void agrandirX3(image img) { /*--/*--.img RECU EN VALEUR.

) } image= img INF1101 Algorithmes et structures de données 42 .Schématisation du passage par valeur lImage image= Le contenu de lImage est copié dans le paramètre img void agrandirX3(image img) agrandirX3(image img) { (..

Chaque attribut de l objet en construction est initialisé selon les valeurs des attributs de l objet à copier.Constructeur de recopie Un constructeur qui sert à créer un objet identique à l objet reçu en paramètre. INF1101 Algorithmes et structures de données 43 .

maHauteur. maTransformation( copie.Exemple d un constructeur de recopie RÉFÉRENCE: cube. } INF1101 Algorithmes et structures de données 44 .maTransformation) { maLargeur = copie. maLongueur = copie.maLongueur.maLargeur.cpp Cube::Cube(const Cube &copie) : maCouleur( copie. maHauteur = copie.maCouleur ).

Il est aussi appelé lorsqu une fonction retourne un objet (attention: le constructeur de recopie n est pas appelé lorsqu une fonction retourne une référence à un objet).Appel du constructeur de recopie Le constructeur de recopie est appelé lorsqu on doit créer une instance d un objet qui est la copie d un autre objet. La fonction créera une copie temporaire de l objet pour les fins de la fonction. Le constructeur de recopie est toujours appelé lorsqu un objet est envoyé par valeur à une autre fonction. INF1101 Algorithmes et structures de données 45 .

Les destructeurs sont appelés dans l ordre inverse des constructeurs.Destructeurs Le destructeur est une fonction membre publique appelée implicitement lors de la destruction d un objet. La fonction principale d un destructeur réside dans la désallocation de mémoire dynamique qui a été allouée par le constructeur. INF1101 Algorithmes et structures de données 46 .

char* unNom). maPosition. }. static unsigned int nbSphere. INF1101 Algorithmes et structures de données 47 . Sphere(const sphere &copie). Sphere(float unRayon. private: float char* Couleur Translation Rotation Destructeur monRayon. monNom.h class Sphere { public: Sphere(). .Destructeurs (suite) RÉFÉRENCE: sphere. monAngle. ~Sphere(). maCouleur. . .

nbSphere--.Destructeurs (suite) Constructeur de sphere : Sphere::Sphere() : monRayon( 0 ). monNom = new char[30]. } INF1101 Algorithmes et structures de données 48 . maTransformation( ) { nbSphere++. if(monNom) delete []monNom. } Destructeur de sphere : Sphere::~Sphere() { nbSphere--. maCouleur( ).

Constructeur et destructeur Une classe a toujours automatiquement un constructeur par défaut. Le constructeur de recopie implicite fait une copie attribut par attribut. un constructeur de recopie et un destructeur sans qu il soit nécessaire de les écrire. INF1101 Algorithmes et structures de données 49 .

New d un objet (constructeur) L allocation dynamique permet la création d un objet ou d un vecteur d objets. Voir exemple sur les new INF1101 Algorithmes et structures de données 50 .

c est-à-dire une classe qui permet de stocker n importe quel type d objet. INF1101 Algorithmes et structures de données 51 . Inclusion de la librairie: #include <vector> Déclaration en spécifiant le nom du vecteur et le type d éléments à conserver: Ex: vector<int> lesEntiers. La classe vector est une classe générique.Vecteurs Utilisation de la classe vector de la librairie STL pour une gestion plus facile et efficace.

Manipulation d un vecteur Redimensionnement d un vecteur : vector<image> Im.resize(9). Récupérer le nombre d éléments d un vecteur avec la fonction size() : Im. Accès à une position avec l opérateur [ ] : image UneIm=Im[4].size().clear(). INF1101 Algorithmes et structures de données 52 . Il est aussi possible de retirer tout les élements d un vecteur : Im. Im.

La concaténation (+=). L accès à un caractère ([]) et ([]) La taille de la chaîne (.size() ). INF1101 Algorithmes et structures de données 53 . La classe string gère toute manipulation d une chaîne de caractères.Utilisation d un string Inclusion de la librairie: #include <string> Déclaration en spécifiant le nom de la chaîne Ex: string c_chaine. tel que la copie (=).

size()-1]=µs¶. INF1101 Algorithmes et structures de données 54 . c_chaine=³Bonjour´. c_chaine[c_chaine.Utilisation d un string Exemple: c_chaine=³Bonjour´. c_chaine+=³ le monde´.size()c_chaine[c_chaine.