54
INF1101 Algorithmes et st ructures de données 1 Cours 1 Cours 1 Les classes et les objets Les classes et les objets

INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

Embed Size (px)

Citation preview

Page 1: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données

1

Cours 1Cours 1

Les classes et les objetsLes classes et les objets

Page 2: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 2

Plan du cours 2Plan du cours 2

I.I. Principe de modélisation orientée objetPrincipe de modélisation orientée objetII.II. Définition et implémentation d’une classeDéfinition et implémentation d’une classeIII.III. Constructeurs et destructeursConstructeurs et destructeursIV. IV. Détails de C++Détails de C++V.V. Conversion de types Conversion de types

Page 3: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 3

I - Principe de modélisation I - Principe de modélisation orientée objetorientée objet

Classe Classe ObjetObjet Principe d’encapsulationPrincipe d’encapsulation RéutilisationRéutilisation

Page 4: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 4

Une classeUne classe

Un objet possède des Un objet possède des attributsattributs (propriétés) (propriétés) et des comportements ou des opérations et des comportements ou des opérations sur ces attributs, réalisées par des sur ces attributs, réalisées par des fonctions fonctions membresmembres (on les appelle aussi (on les appelle aussi méthodesméthodes))

On définit une classe pour représenter On définit une classe pour représenter un ensemble d'objets ayant les mêmes un ensemble d'objets ayant les mêmes propriétés et des comportements propriétés et des comportements

communs.communs.

Page 5: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 5

Une classeUne classe

Supposons un logiciel qui doit traiter plusieurs Supposons un logiciel qui doit traiter plusieurs types de cube, tel que une boîte 10x5x20, de types de cube, tel que une boîte 10x5x20, de couleur rouge, ou bien un cube 5x5x5 de couleur couleur rouge, ou bien un cube 5x5x5 de couleur orange.orange.

Il faut travailler avec plusieurs types de cubes Il faut travailler avec plusieurs types de cubes mais qui mais qui possèdent tous les mêmes propriétés et les possèdent tous les mêmes propriétés et les mêmes mêmes opérations (ou comportements) pour modifier ces opérations (ou comportements) pour modifier ces propriétés.propriétés.

Page 6: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 6

Une classe (suite)Une classe (suite)

Une classe est donc un « super » type que l’on définit, une Une classe est donc un « super » type que l’on définit, une généralisation d’un objet possédant des propriétés etgénéralisation d’un objet possédant des propriétés et des opérations (ou comportements). des opérations (ou comportements).

Dans le langage C++, une classe ressemble à une structure Dans le langage C++, une classe ressemble à une structure que l’on définirait (que l’on définirait (struct type_cubestruct type_cube) avec des ) avec des méthodes (ou fonctions membres) pouvant modifier les méthodes (ou fonctions membres) pouvant modifier les champs de la structure.champs de la structure.

LargeurLargeurLongueurLongueur

HauteurHauteur

Page 7: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 7

Attributs et opérations d’une Attributs et opérations d’une classeclasse

Les propriétés d'un objet sont représentées à l'aide Les propriétés d'un objet sont représentées à l'aide d'attributs.d'attributs.

Des valeurs sont associées à ces attributs.Des valeurs sont associées à ces attributs. ExempleExemple : Largueur de Cube1 est 10 : Largueur de Cube1 est 10

Les comportements d'un objet sont représentés à Les comportements d'un objet sont représentés à l'aide l'aide de fonctions membres (méthodes).de fonctions membres (méthodes).

Une fonction membre est une action ou une Une fonction membre est une action ou une transformation qui peut être effectuée sur un objet transformation qui peut être effectuée sur un objet ou ou par un objetpar un objet. ExempleExemple : Pour effectuer un : Pour effectuer un déplacement, déplacement, il est nécessaire de faire il est nécessaire de faire translatertranslater le cube. le cube.

Page 8: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 8

Représentation d’une Représentation d’une classeclasse

Nom de la classe

Listes des attributs

attribut: type

Listes des fonctions membres

fonction(arguments): valeur retournée

Cube

Largeur: doubleLongueur: doubleHauteur: double

setCouleur ( Couleur )

setTaille (haut, larg, long )

Page 9: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 9

Un objetUn objet

ExempleExemple::Un rectangle 5x10x20 est un objet de classe Cube et Un rectangle 5x10x20 est un objet de classe Cube et un un Cube 5x5x5Cube 5x5x5 est un autre objet de la classeest un autre objet de la classe Cube.Cube.

Un objetUn objet est donc une instanciation d’une classe. est donc une instanciation d’une classe.

Cet objet possède tous les attributs et toutes les Cet objet possède tous les attributs et toutes les fonctions membres de la classe, mais avec des fonctions membres de la classe, mais avec des valeurs d’attributs propres à l’objet.valeurs d’attributs propres à l’objet.

Page 10: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 10

Un objet (suite)Un objet (suite)

Une fois qu’une classe Cube a été définie, il est possibleUne fois qu’une classe Cube a été définie, il est possibled’instancier des objets de la classe Cube, qui posséderontd’instancier des objets de la classe Cube, qui posséderontdes attributs associés à des valeurs.des attributs associés à des valeurs.

Largeur = 5Largeur = 5Hauteur = 10Hauteur = 10

ChangerCouleurChangerCouleur

rectanglerectangle

Page 11: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 11

Représentation d'une Représentation d'une instanceinstance

(Cube)

Hauteur = 5Longueur = 5Largeur = 5

(Cube)

Hauteur = 5Longueur = 5Largeur = 5

Cube unCube;Cube unCube;

Nom de l’objetNom de l’objetLa classeLa classe

Valeurs par défautValeurs par défaut

Page 12: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 12

Programmation par objetsProgrammation par objetsPrincipe d’encapsulation (masquage des données)Principe d’encapsulation (masquage des données)

Types de données abstraits ( classe indépendante Types de données abstraits ( classe indépendante de son implémentation)de son implémentation). L’implémentation de . L’implémentation de classe peut changer et le client est toujours classe peut changer et le client est toujours fonctionnel.fonctionnel.

Réutilisation, réutilisation, réutilisation…Réutilisation, réutilisation, réutilisation…

Réutilisation: agrégation, héritage, généralisation.Réutilisation: agrégation, héritage, généralisation.

Page 13: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 13

Principe d’encapsulationPrincipe d’encapsulation

LargeurLongueurHauteurCouleur

LargeurLongueurHauteurCouleur

Les valeurs des attributs peuventLes valeurs des attributs peuventêtre changées seulement par les être changées seulement par les méthodes fournies avec l'objet.méthodes fournies avec l'objet.

Changer Taille

L'état de l'objet ne peut être modifiéL'état de l'objet ne peut être modifiédirectement par le client. directement par le client.

Écrire Info

Translater

Rotation Les opérations pour afficher les Les opérations pour afficher les valeurs des attributs pour le clientvaleurs des attributs pour le client

Changer Couleur

Page 14: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 14

La réutilisationLa réutilisation

La réutilisation est une notionLa réutilisation est une notionomniprésente dans le langageomniprésente dans le langageC++, car il est possible C++, car il est possible d’utiliserd’utiliserune classe d’un certain une classe d’un certain contextecontextepour la redéfinir dans un autrepour la redéfinir dans un autrecontexte en effectuant un contexte en effectuant un héritage héritage

HéritageHéritage

Page 15: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 15

II - II - Définition et implémentation Définition et implémentation d’une classed’une classe

• ClasseClasse• AttributsAttributs• Fonctions membresFonctions membres• Double inclusion du fichier d’entêteDouble inclusion du fichier d’entête• Paramètres par défaut des fonctionsParamètres par défaut des fonctions• InlineInline• Principe d’encapsulation et Principe d’encapsulation et

abstraction des donnabstraction des donnéesées

Page 16: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 16

ClasseClasse• En C++, la définition d’une classe débute En C++, la définition d’une classe débute

toujours en spécifiant toujours en spécifiant classclass, , suivie du nom de suivie du nom de la classe. la classe.

• Toute l’interface de la classe, c’est-à-dire les Toute l’interface de la classe, c’est-à-dire les attributs et attributs et

les signatures (entête) de fonctions, est les signatures (entête) de fonctions, est contenuecontenue

entre des accolades. entre des accolades. La définition d’une classe se situe La définition d’une classe se situe

TOUJOURS TOUJOURS dans un fichier entête (ex: cube.h)dans un fichier entête (ex: cube.h)

Exemple:Exemple: class Cubeclass Cube {{

(. . . Définition)(. . . Définition) }; }; Note: ne pas oublier le “ ; ” aprNote: ne pas oublier le “ ; ” après la deuxième ès la deuxième

accoladeaccolade..

Page 17: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 17

Interface et implémentation Interface et implémentation d’une classed’une classe

• L’implémentation de la classe L’implémentation de la classe représente la définition des représente la définition des fonctions membres. (fichier.cpp)fonctions membres. (fichier.cpp)

• L’interface d’une classe représente L’interface d’une classe représente les comportements ou les fonctions les comportements ou les fonctions membres disponibles aux clients membres disponibles aux clients

( fichier.h).( fichier.h).

Page 18: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 18

AttributsAttributs

• Les attributs d’une classe sont des variables ou Les attributs d’une classe sont des variables ou des pointeurs, mais qui ne seront généralement des pointeurs, mais qui ne seront généralement accessibles que par les fonctions membres de la accessibles que par les fonctions membres de la classe. Principe d’encapsulation.classe. Principe d’encapsulation.

• D’aucune façon les attributs pourront être D’aucune façon les attributs pourront être modifiés ou accédés à l’extérieur de la classe (ex: modifiés ou accédés à l’extérieur de la classe (ex: à partir du à partir du main()main()). Ils seront accessibles à l’aide ). Ils seront accessibles à l’aide des fonctions membres.des fonctions membres.

• Pour les protéger, on indique que les attributs Pour les protéger, on indique que les attributs seront classifiés seront classifiés privateprivate..

Page 19: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 19

Attributs (suite)Attributs (suite)

Pour la classe Cube, on a: Pour la classe Cube, on a:

RRÉFÉRENCE: cube.hÉFÉRENCE: cube.h

class Cubeclass Cube{{private:private:

int Largeur;int Largeur;int Longeur;int Longeur;int Hauteur;int Hauteur;Couleur maCouleur;Couleur maCouleur;. . .. . .

};};

Page 20: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 20

Attributs (suite)Attributs (suite)

Cependant, le compilateur déclarera les attributs Cependant, le compilateur déclarera les attributs privateprivate par défaut (mais c’est une bonne par défaut (mais c’est une bonne habitude de habitude de toujours le spécifier explicitement):toujours le spécifier explicitement):

class Cubeclass Cube{{

int Largeur;int Largeur;int Longeur;int Longeur;int Hauteur;int Hauteur;Couleur maCouleur;Couleur maCouleur;. . .. . .

};};

Page 21: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 21

Fonctions membresFonctions membres

• Afin de pouvoir manipuler les attributs d’une Afin de pouvoir manipuler les attributs d’une classe, nous avons recours aux fonctions classe, nous avons recours aux fonctions membres qui permettent de retourner ou modifier membres qui permettent de retourner ou modifier la valeur d’un ou des attributs.la valeur d’un ou des attributs.

• Les fonctions membres qui seront accessibles au Les fonctions membres qui seront accessibles au client de la classe seront signalées par : client de la classe seront signalées par : publicpublic

• De ce fait même, les fonctions membres qui n’ont De ce fait même, les fonctions membres qui n’ont aucune utilité à l’extérieur de la classe mais qui aucune utilité à l’extérieur de la classe mais qui seront utilisées uniquement par la classe peuvent seront utilisées uniquement par la classe peuvent être regroupées dans la section être regroupées dans la section privateprivate

Page 22: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 22

Fonctions membres Fonctions membres (suite)(suite)

Pour la classe Cube, on a :Pour la classe Cube, on a :

class Cubeclass Cube{{

public:public:void setTaille(float la, float lo, float ha);void setTaille(float la, float lo, float ha);void setCouleur(const couleur &uneCouleur);void setCouleur(const couleur &uneCouleur);void setTransformation(const transf &uneTransformation);void setTransformation(const transf &uneTransformation);void getTaille(float &la, float &lo, float &ha) const;void getTaille(float &la, float &lo, float &ha) const;Couleur getCouleur() const;Couleur getCouleur() const;......

private:private:int Largeur;int Largeur;

int Longeur;int Longeur;int Hauteur;int Hauteur;Couleur maCouleur;Couleur maCouleur;

......};};

Page 23: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 23

Implémentation d’une Implémentation d’une fonction membrefonction membre

• La définition de la classe est située dans le La définition de la classe est située dans le fichier .h de la classe, toutes les implémentations fichier .h de la classe, toutes les implémentations des fonctions membres d’une classe se situent des fonctions membres d’une classe se situent dans le fichier .cpp de la classe (ex: moteur.cpp).dans le fichier .cpp de la classe (ex: moteur.cpp).L’implémentation d’une classe devrait L’implémentation d’une classe devrait TOUJOURSTOUJOURSêtre dans un fichier .cpp (ex: cube.cpp) et être dans un fichier .cpp (ex: cube.cpp) et avoir le même nom que la classe.avoir le même nom que la classe.

• La nomenclature à utiliser pour identifier une La nomenclature à utiliser pour identifier une fonction fonction

membre d’une classe dans le fichier .cpp est: membre d’une classe dans le fichier .cpp est: [T[Type de retour de la fonction] [Nom de classe]::[Nom de la ype de retour de la fonction] [Nom de classe]::[Nom de la

fonctionfonction] ] (Paramètres de la fontion) { (Paramètres de la fontion) { Implémentation de la fonction . . .Implémentation de la fonction . . .}}

Page 24: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 24

Exemple d’implémentation Exemple d’implémentation d’une fonction membred’une fonction membre

Dans la classe Cube, on retrouverait dans le fichierDans la classe Cube, on retrouverait dans le fichierCube.cpp l’implémentation de la fonction membre setTaille()Cube.cpp l’implémentation de la fonction membre setTaille() : :

void Cube::setTaillevoid Cube::setTaille(float uneLargeur, float uneLongueur, (float uneLargeur, float uneLongueur, float uneHauteur)float uneHauteur){{

maLargeur = uneLargeur;maLargeur = uneLargeur;maLongueur = uneLongueur;maLongueur = uneLongueur;maHauteur = uneHauteur;maHauteur = uneHauteur;

}}

Page 25: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 25

Double inclusion du Double inclusion du fichier d’entête : fichier d’entête : problématiqueproblématique

Problématique:Problématique:En compilant tout le programme, le compilateur En compilant tout le programme, le compilateur passera à travers tous les fichiers séquentiellement. passera à travers tous les fichiers séquentiellement. Cependant, si le compilateur passe deux fois à Cependant, si le compilateur passe deux fois à travers un fichier .h contenant la définition d’une travers un fichier .h contenant la définition d’une classe, ce dernier indiquera une erreur de classe, ce dernier indiquera une erreur de redéfinition. redéfinition.

Comment faire pour que le compilateur ne Comment faire pour que le compilateur ne passe passe qu’une seule fois à travers la définition d’une qu’une seule fois à travers la définition d’une classeclasseafin d’éviter la redéfinitionafin d’éviter la redéfinition??

Page 26: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 26

Double inclusion du Double inclusion du fichier d’entête : solutionfichier d’entête : solution

Solution:Solution:#ifndef CUBE_H#ifndef CUBE_H#define#define CUBE_HCUBE_H

class Cubeclass Cube{{. . .. . .};};#endif#endif

Page 27: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 27

Double inclusion du Double inclusion du fichier d’entête : fichier d’entête : explicationsexplications

La premiLa première fois que le compilateur passe à travers le fichier cube.h ère fois que le compilateur passe à travers le fichier cube.h pour compiler la définition (ou l’interface) de la classe Cube:pour compiler la définition (ou l’interface) de la classe Cube:1)1) #ifndef CUBE_H #ifndef CUBE_H : Est ce que l : Est ce que lee mot mot CUBE_HCUBE_H a été a été définidéfini? Non.? Non.

2) Alors, 2) Alors, #define CUBE_H : #define CUBE_H : Définir le mot Définir le mot CUBE_H CUBE_H

3)3) #endif : #endif : Termine la déTermine la définitionfinition

La deuxième fois que le compilateur passe à travers le fichier cube.hLa deuxième fois que le compilateur passe à travers le fichier cube.hpour compiler la définition (ou l’interface) de la classe Cube:pour compiler la définition (ou l’interface) de la classe Cube:1) 1) #ifndef CUBE_H#ifndef CUBE_H Est ce que l Est ce que le mot e mot CUBE_HCUBE_H a été a été définidéfini? Oui.? Oui.2) Alors, sort du fichier.2) Alors, sort du fichier.

Page 28: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 28

Exemple double inclusion Exemple double inclusion du fichier d’entêtedu fichier d’entête

Vérifiez le problème de la double inclusion en mettant enVérifiez le problème de la double inclusion en mettant encommentaire dans le fichier cube.h:commentaire dans le fichier cube.h:#ifndef CUBE_H, #define CUBE_H et #endif#ifndef CUBE_H, #define CUBE_H et #endif

Compilez tout le programme, et observez l’erreur:Compilez tout le programme, et observez l’erreur:

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

Le compilateur indique cette erreur puisque le fichier Le compilateur indique cette erreur puisque le fichier Cube.h est inclus dans voiture.h et dans main.cpp.Cube.h est inclus dans voiture.h et dans main.cpp.Ainsi, le compilateur passe deux fois dans le fichier Cube.h,Ainsi, le compilateur passe deux fois dans le fichier Cube.h,et puisque que les entêtes de double inclusion ont été et puisque que les entêtes de double inclusion ont été retirées, il y a redéfinition de la classe Cube.retirées, il y a redéfinition de la classe Cube.

Page 29: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 29

Paramètres par défaut des Paramètres par défaut des fonctionsfonctions

• Les signatures des fonctions recevant des Les signatures des fonctions recevant des paramètres peuvent posséder des valeurs paramètres peuvent posséder des valeurs de défaut si aucun paramètre n’est envoyé de défaut si aucun paramètre n’est envoyé lors de l’appel de la fonction.lors de l’appel de la fonction.

• Les valeurs par défaut des paramètres Les valeurs par défaut des paramètres doivent se trouver seulement dans la doivent se trouver seulement dans la déclaration des fonctions membres de déclaration des fonctions membres de l’interface de la classe et non pas dans l’interface de la classe et non pas dans l’implémentation de la fonction membre.l’implémentation de la fonction membre.

Page 30: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 30

Paramètres par défaut des Paramètres par défaut des fonctions (suite)fonctions (suite)

RRÉFÉRENCE: Cube.h, Cube(…)ÉFÉRENCE: Cube.h, Cube(…)void setTaille2(float uneLargeur=5, void setTaille2(float uneLargeur=5,

float uneLongueur=5, float uneHauteur=5float uneLongueur=5, float uneHauteur=5););

ExempleExemple::

• Si Si setTaille2setTaille2()() est appelée sans paramètres, la est appelée sans paramètres, la fonction recevra des paramètres avec les valeurs fonction recevra des paramètres avec les valeurs de défaut.de défaut.

Cube C2;Cube C2; C2.setTaille2();C2.setTaille2(); C2.setTaille2(2,6);C2.setTaille2(2,6); C2.C2.setTaille2setTaille2(2);(2); // Impossible de faire M2.SetValvesCylindre(,6);// Impossible de faire M2.SetValvesCylindre(,6);

Page 31: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 31

III - III - Constructeurs et Constructeurs et destructeursdestructeurs

• Constructeurs par défaut et par Constructeurs par défaut et par paramètresparamètres

• Constructeur de recopieConstructeur de recopie• DestructeursDestructeurs• New d’un objet (constructeur)New d’un objet (constructeur)

Page 32: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 32

Le constructeurLe constructeur

• Le constructeur est une fonction Le constructeur est une fonction membre publique appelée membre publique appelée implicitement lors de la création d’un implicitement lors de la création d’un objet.objet.

• Pour un tableau d’objet, le constructeur Pour un tableau d’objet, le constructeur par défaut est appelé pour chaque par défaut est appelé pour chaque élément du tableau.élément du tableau.

• Le constructeur sert à initialiser un objet Le constructeur sert à initialiser un objet lors de sa création.lors de sa création.

Page 33: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 33

Constructeurs par défautConstructeurs par défaut

Un constructeur par défaut :Un constructeur par défaut :

• Constructeur ne recevant aucun paramètre.Constructeur ne recevant aucun paramètre.

RÉFÉRENCE: cube.cpp, RÉFÉRENCE: cube.cpp,

Cube::Cube()Cube::Cube()

{{ maLargeur = 0;maLargeur = 0; maLongueur = 0;maLongueur = 0; maHauteur = 0;maHauteur = 0;}}

Page 34: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 34

Constructeurs par Constructeurs par paramètresparamètres• Un constructeur par paramètres est un Un constructeur par paramètres est un

constructeur recevant des paramètres constructeur recevant des paramètres afin d’initialiser les attributs de l’objet afin d’initialiser les attributs de l’objet selon les valeurs des arguments reçus.selon les valeurs des arguments reçus.

• Contrairement au constructeur par Contrairement au constructeur par défaut, une classe peut posséder défaut, une classe peut posséder plusieurs constructeurs par paramètres, plusieurs constructeurs par paramètres, ayant tous des signatures différentes. ayant tous des signatures différentes.

Page 35: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 35

Constructeurs par Constructeurs par paramètresparamètres

RÉFÉRENCE: cube.cppRÉFÉRENCE: cube.cpp

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

Page 36: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 36

Constructeurs par défaut et Constructeurs par défaut et paramètresparamètres

• NoteNote: il ne peut jamais coexister dans : il ne peut jamais coexister dans une classe un constructeur par défaut une classe un constructeur par défaut sans paramètres et un constructeur par sans paramètres et un constructeur par défaut avec des paramètres possédant défaut avec des paramètres possédant des valeurs de défaut. Il ne peut y avoir des valeurs de défaut. Il ne peut y avoir qu’un seul constructeur par défaut.qu’un seul constructeur par défaut.

• Il y aurait une ambiguïté lors de l’appel Il y aurait une ambiguïté lors de l’appel d’un constructeur, le compilateur ne d’un constructeur, le compilateur ne sachant pas quel constructeur appeler.sachant pas quel constructeur appeler.

Page 37: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 37

Constructeurs par défaut et Constructeurs par défaut et par paramètres (suite)par paramètres (suite)

Un constructeur par défaut et par paramètres : Un constructeur par défaut et par paramètres : Constructeur possédant des paramètres avec des valeurs Constructeur possédant des paramètres avec des valeurs de défaut.de défaut.

RÉFÉRENCE: couleur.hRÉFÉRENCE: couleur.hclass Couleurclass Couleur{{public:public: Couleur(float r=0, float g=0, float b=0)Couleur(float r=0, float g=0, float b=0) ;;. . .. . .

private:private: float rouge;float rouge; float vert;float vert; float bleu;float bleu;}}

Page 38: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 38

Constructeurs par défaut et Constructeurs par défaut et par paramètres (suite)par paramètres (suite)

• Faire une démonstration de Faire une démonstration de l’ambiguité.l’ambiguité.

• Il n’y aura pas d’ambiguité tant Il n’y aura pas d’ambiguité tant que l’on ne déclare pas d’objets que l’on ne déclare pas d’objets (seulement un warning).(seulement un warning).

Page 39: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 39

Passage par rPassage par référenceéférence

void agrandirX2(image & img) //img change de valeurvoid agrandirX2(image & img) //img change de valeur{{ /*--- modification de l'image transmise /*--- modification de l'image transmise a la fonction ----*/a la fonction ----*/

img.bitmap = imgX2.bitmap;img.bitmap = imgX2.bitmap; img.largeur = imgX2.largeur;img.largeur = imgX2.largeur; img.hauteur = imgX2.hauteur;img.hauteur = imgX2.hauteur; . . .. . .

En ajoutant un & devant le paramEn ajoutant un & devant le paramètre reçu, ceci indique qu’une référenceètre reçu, ceci indique qu’une référence à l’adresse est transmise, et donc en modifiant la valeur du paramètreà l’adresse est transmise, et donc en modifiant la valeur du paramètre dans la fonction, la modification sera conservée à la sortie de la fonction.dans la fonction, la modification sera conservée à la sortie de la fonction.

Page 40: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 40

Schématisation du Schématisation du passage par référencepassage par référence

imageimage

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

(..)(..)}}

lImagelImageL’objet reçoit temporairementL’objet reçoit temporairementun nouveau nom qui sera utiliséun nouveau nom qui sera utilisépar la fonctionpar la fonction

imgimg

Page 41: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 41

Passage par valeurPassage par valeur

void agrandirX3(image img)void agrandirX3(image img) {{

/*--- modification de l'image transmise a la fonction ----*//*--- modification de l'image transmise a la fonction ----*/ img.bitmap = imgX2.bitmap;img.bitmap = imgX2.bitmap; img.largeur = imgX2.largeur;img.largeur = imgX2.largeur; img.hauteur = imgX2.hauteur; img.hauteur = imgX2.hauteur; // <- img RECU EN VALEUR, // <- img RECU EN VALEUR, NE CHANGERA PAS!NE CHANGERA PAS! } }

Contrairement à la transmission par référence, la transmission parContrairement à la transmission par référence, la transmission par valeur fait une copie temporaire de la variable dans la fonction, et doncvaleur fait une copie temporaire de la variable dans la fonction, et donc une modification de la variable ne sera pas conservée à la sortie de laune modification de la variable ne sera pas conservée à la sortie de la fonction, puisque la modification a été faite sur une variable temporaire.fonction, puisque la modification a été faite sur une variable temporaire.

Page 42: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 42

void agrandirX3(void agrandirX3(image imgimage img)){{

(..)(..)}}

Schématisation du Schématisation du passage par valeurpassage par valeur

image=image=

lImagelImage

image=image=

Le contenu de lImage Le contenu de lImage est copié dans le paramètre est copié dans le paramètre imgimg

imgimg

Page 43: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 43

Constructeur de recopieConstructeur de recopie

• Un constructeur qui sert à créer un Un constructeur qui sert à créer un objet identique à l’objet reçu en objet identique à l’objet reçu en paramètre. paramètre.

• Chaque attribut de l’objet en Chaque attribut de l’objet en construction est initialisé selon les construction est initialisé selon les valeurs des attributs de l’objet à valeurs des attributs de l’objet à copier. copier.

Page 44: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 44

Exemple d’un constructeur Exemple d’un constructeur de recopiede recopie

RÉFÉRENCE: cube.cppRÉFÉRENCE: cube.cpp

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

Page 45: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 45

Appel du constructeur de Appel du constructeur de recopierecopie• Le constructeur de recopie est appelé Le constructeur de recopie est appelé

lorsqu’on doit créer une instance d’un objet lorsqu’on doit créer une instance d’un objet qui est la copie d’un autre objet.qui est la copie d’un autre objet.

• Le constructeur de recopie est toujours appelé Le constructeur de recopie est toujours appelé lorsqu’un objet est envoyé par valeur à une lorsqu’un objet est envoyé par valeur à une autre fonction. La fonction créera une copie autre fonction. La fonction créera une copie temporaire de l’objet pour les fins de la temporaire de l’objet pour les fins de la fonction.fonction.

• Il est aussi appelé lorsqu’une fonction retourne Il est aussi appelé lorsqu’une fonction retourne un objet (attention: le constructeur de recopie un objet (attention: le constructeur de recopie n’est pas appelé lorsqu’une fonction retourne n’est pas appelé lorsqu’une fonction retourne une référence à un objet).une référence à un objet).

Page 46: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 46

DestructeursDestructeurs• Le destructeur est une fonction membre Le destructeur est une fonction membre

publique appelée implicitement lors de la publique appelée implicitement lors de la destruction d’un objet.destruction d’un objet.

• Les destructeurs sont appelés dans l’ordre Les destructeurs sont appelés dans l’ordre inverse des constructeurs.inverse des constructeurs.

• La fonction principale d’un destructeur réside La fonction principale d’un destructeur réside dans la dans la désallocation de mémoire désallocation de mémoire dynamiquedynamique qui a été allouée par le qui a été allouée par le constructeur.constructeur.

Page 47: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 47

Destructeurs (suite)Destructeurs (suite)

RÉFÉRENCE: sphere.hRÉFÉRENCE: sphere.hclass Sphereclass Sphere{{ public:public: Sphere();Sphere(); Sphere(float unRayon, char* unNom);Sphere(float unRayon, char* unNom); Sphere(const sphere &copie);Sphere(const sphere &copie); ~Sphere();~Sphere(); . . .. . . private:private:

floatfloat monRayon;monRayon;char* char* monNom;monNom;CouleurCouleur maCouleur;maCouleur;TranslationTranslation maPosition;maPosition;

Rotation monAngle;Rotation monAngle;

static unsigned int nbSphere;static unsigned int nbSphere;};};

DestructeurDestructeur

Page 48: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 48

Destructeurs (suite)Destructeurs (suite)

Sphere::~Sphere()Sphere::~Sphere(){{ nbSphere--;nbSphere--;

if(monNom)if(monNom)delete []monNom;delete []monNom;

}}

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

Constructeur de sphere :Constructeur de sphere : Destructeur de sphere : Destructeur de sphere :

Page 49: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 49

Constructeur et Constructeur et destructeurdestructeur• Une classe a toujours Une classe a toujours

automatiquement un constructeur automatiquement un constructeur par défaut, un constructeur de par défaut, un constructeur de recopie et un destructeur sans qu’il recopie et un destructeur sans qu’il soit nécessaire de les écrire.soit nécessaire de les écrire.

• Le constructeur de recopie implicite Le constructeur de recopie implicite fait une copie attribut par attribut.fait une copie attribut par attribut.

Page 50: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 50

New d’un objet New d’un objet (constructeur)(constructeur)

• L’allocation dynamique permet la L’allocation dynamique permet la création d’un objet ou d’un vecteur création d’un objet ou d’un vecteur d’objets.d’objets.

• Voir exemple sur les Voir exemple sur les newnew

Page 51: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 51

VecteursVecteurs• Utilisation de la classe vector de la librairie

STL pour une gestion plus facile et efficace.• La classe vector est une classe générique,

c’est-à-dire une classe qui permet de stocker n’importe quel type d’objet.

• 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;

Page 52: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 52

Manipulation d’un vecteurManipulation d’un vecteur• Redimensionnement d’un vecteur : vector<image> Im;

Im.resize(9);• Accès à une position avec l’opérateur [ ] :

image UneIm=Im[4];• Il est aussi possible de retirer tout les

élements d’un vecteur :Im.clear();Im.clear();

• Récupérer le nombre d’éléments d’un vecteur avec la fonction size() :

Im.size();Im.size();

Page 53: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 53

Utilisation d’un stringUtilisation d’un string• Inclusion de la librairie: #include <string>

• Déclaration en spécifiant le nom de la chaîne Ex: string c_chaine;

• La classe string gère toute manipulation d’une chaîne de caractères, tel que • la copie (=), la copie (=), • La concaténation (+=), La concaténation (+=), • L’accès à un caractère (L’accès à un caractère ([])[]) et et • La taille de la chaîne (.size() ).La taille de la chaîne (.size() ).

Page 54: INF1101 Algorithmes et structures de données1 Cours 1 Les classes et les objets

INF1101 Algorithmes et structures de données 54

Utilisation d’un stringUtilisation d’un string

• Exemple: c_chaine=c_chaine=“Bonjour”; “Bonjour”;

c_chaine+=“ le monde”;c_chaine+=“ le monde”;

c_chaine[c_chaine.size()-1]=‘s’;c_chaine[c_chaine.size()-1]=‘s’;