Programmation Orienté Objet en C++(science5)

MODULE : POO 

Enseignant : Mohamed Kharrat Année universitaire 2016/2017 

Séance 5 

C++ : classes 

– Interface de classe – Implantation – Constructeur / destructeur – Héritage / polymorphisme 

Objet? 

Différence de la programmation OO par rapport à la programmation impérative/procédurale 

Programmation orientée objet vs programmation impérative 

Si on décide de modifier la structure des données dans un programme séquentiel, presque tout le code est à réécrire 

Langage Orienté Objet : qu’est-ce qu’un objet ? 

– des données membres (ou champs ou attributs ou variables d’instances) – des fonctions membres (ou méthodes ou routines) 

On appelle encapsulation le regroupement des variables et des fonctions au sein d’une même entité. 

Données membres 

Fonctions membres 

Ex : un objet vecteur est composé de trois réels et d’opérations telles que la translation, la norme, le 

produit scalaire … 

Vision interne Partie privée 

Partie publique Vision externe 

Vision interne 

Vision externe 

Objet : exemples (notation UML) 

DeuxRoues m_tailleRoues m_nbVitesses m_couleur m_poids Accélérer() Freiner() ChangerVitesse() GetCouleur() GetPoids() 

Nom de la classe 

Données membres ou attributs 

Fonctions membres ou méthodes 

CompteBancaire m_numéro m_solde m_propriétaire Créditer() Débiter() Fermer() Numéro() Solde() Propriétaire() 

Vision interne 

Vision externe 

Propriétés d’un objet 

L’état correspond à la valeur de ses attributs à un instant donné. Il peut varier au cours du temps. 

Une classe est un prototype qui définit des attributs et des méthodes communes à tous les objets d’une certaine nature. C’est donc un modèle utilisé pour créer plusieurs objets présentant des caractéristiques communes. 

Les objets peuvent être distingués grâce à leurs existences inhérentes et non grâce à la description des propriétés qu’ils peuvent avoir. Deux objets peuvent être distincts même si tous leurs attributs ont des valeurs identiques. 

Ne pas confondre instance d’objet et classe d’objets 

Une instance de classe fait référence à une chose précise Une classe désigne un groupe de choses similaires Ex : Le vélo de mon voisin et le mien sont deux instances de la classe vélo, même s’ils sont strictement identiques 

Classe (plan de construction

www

Objet (instance de la classe

Objet (instance de 

la classe

Objet (instance de 

la classe

Notion d’héritage 

Deux roues 

Sans moteur 

Scooter 

classe de base ou classe mère ou classe parente 

classes dérivées A moteur 

ou classes filles 

Vélo Patinette 

Moto Mobylette 

Héritage: Relations a-un, est-un, utilise-un 

Notion de polymorphisme 

Une classe dérivée peut fournir une nouvelle définition d’une méthode d’une classe parent car elle peut avoir besoin de réagir différemment à l’appel de cette méthode. Cette redéfinition substituera une méthode à une autre : c’est la spécialisation. 

DeuxRoues m_tailleRoues m_couleur m_poids m_nbVitesses virtual Accélérer() virtual Freiner() virtual ChangerVitesse() GetCouleur() GetPoids() 

Velo m_typePedale GetTypePedale() virtual Accélérer() virtual Freiner() virtual ChangerVitesse() 

Moto m_moteur m_boiteVitesse FairePlein() AllumerClignotant() virtual Accélérer() virtual Freiner() virtual ChangerVitesse() 

La fonction Accélérer() n’est pas la même pour un Velo et une Moto. La redéfinition de cette fonction dans chacune des sous-classes entraînera un comportement différent suivant que le DeuxRoues est un Velo ou une Moto

Classe : interface 

C’est la description de la structure interne de la classe 

class Ellipse 

Vision interne 

protected : 

float m_cX, m_cY; float m_a, m_b; 

public :Vision externe 

void deplace(float, float ); void zoom(float z); float surface(); 

}; 

NB : dans cet exemple, on a choisi de représenter l’ellipse en interne à la classe par les coordonnées de son centre (cX, cY), par son grand axe a et par son petit axe b. 

Classe : implantation 

Interface de la classe Ellipse 

class Ellipse {protected : 

float m_cX, m_cY; float m_a, m_b; public : 

void deplace(float dx, float dy); void zoom(float z); float surface(); }; 

C’est la définition des fonctions associées 

Opérateur de portée 

void Ellipse::deplace(float dx, float dy) { 

m_cX += dx; m_cY += dy; }void Ellipse ::zoom(float z)

m_a *= z; m_b *= z; }float Ellipse ::surface()

return 3.14 * m_a * m_b / 4.;

Classe : instanciation 

Interface de la classe Ellipse class Ellipse {protected : 

float m_cX, m_cY; float m_r; public : 

void deplace(float dx, float dy); void zoom(float z); float surface(); };Implantation de la classe Ellipse void Ellipse::deplace(float dx, float dy)

m_cX += dx; m_cY += dy; }void Ellipse::zoom(float z)

m_a *= z; m_b *= z; }float Ellipse::surface()

return 3.14 * m_a * m_b / 4.; } 

Instancier une classe permet de créer un objet 

(analogue à une déclaration de variable) 

Accès aux membres par le « . » 

Instanciation statique de 

int main() { 

l’objet e, e étant une variable de type Ellipse 

Ellipse e; 

e.deplace(50, 0); float s = e.surface(); e.zoom(1.5); 

e.m_cX = 30; // Impossible e. deplace(20); // Impossible

Organisation (usuelle) des fichiers 

#include “ellipse.h” 

#include « ellipse.h » 

void Ellipse::deplace(float dx, float dy) { 

m_cX += dx; m_cY += dy; 

int main() { 

Ellipse e; 

}void Ellipse ::zoom(float z)

m_a *= z; 

ellipse.h ellipse.cpp main.cpp 

class Ellipse {protected : 

float m_cX, m_cY; float m_a, m_b; 

e.deplace(50, 0); public :float s = e.surface(); 

void deplace(float dx, float dy); 

e.zoom(1.5); 

void zoom(float z); 

m_b *= z; float surface(); }}; 

float Ellipse :: surface() 

return 0; } 

return 3.14 * m_a * m_b / 4.; } 

Constructeurs de classe 

class MaClasse1 { public: MaClasse1(); // ceci est le constructeur par défaut }; class MaClasse2 { public: MaClasse2( int i = 1 ); // ceci est le constructeur par défaut }; class MaClasse3 { public: MaClasse3( int i ); // ceci n’est pas le constructeur par défaut 

}

La liste d’initialisation 

Personnage::Personnage()

m_vie = 100; m_mana = 100; m_nomArme = « Épée rouillée »; m_degatsArme = 10; } 

Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme(« Épée rouillée »), m_degatsArme(10) { //Rien à mettre dans le corps du constructeur, tout a déjà été fait !

constructeur de copie 

class MaClasse { public: MaClasse( const MaClasse & )

}

Y a-t-il une différence quelconque entre ces deux instructions: MaClasse x; MaClasse x(); 

Constructeurs de classe : exemple 

ellipse.h ellipse.cpp main.cpp 

class Ellipse 

#include “ellipse.h” 

#include « ellipse.h » {public : 

Ellipse::Ellipse() 

int main() Ellipse(); // Constructeur par défaut 

{{ Ellipse(float x, float y, float a, float b); 

m_cX = m_ cY = 0; 

Ellipse e1; Ellipse(const Ellipse & e); 

}m_a = m_b = 1; 

Ellipse e2(2.5, 6.5, 12, 15); Ellipse e3(e1); // e3 est un clone de e1 protected : 

float m_cX, m_cY; float m_a, m_b; 

Ellipse::Ellipse(float x, float y, float a, float b) : 

m_ cX(x), m_ cY(y), m_a(a), m_b(b) {}Ellipse::Ellipse(const Ellipse & e) {m_ cX = e. m_ cX; m_ cY = e. m_ cY; m_a = e.m_a ; m_b = e.m_b; }void Ellipse::deplace(float dx, float dy) {m_ cX += dx; m_cY += dy; } etc … 

Ellipse e4 = e1; // e4 est un clone de e1 return 0; } 

public : 

void deplace(float dx, float dy); void zoom(float z) ; float surface() ; };

Destructeur de classe 

#include “ellipse.h” 

#include « ellipse.h » class Ellipse {Ellipse::Ellipse() 

int main() public :

{ Ellipse(); // Constructeur par défaut 

m_cX = m_ cY = 0; 

Ellipse e; Ellipse (float x, float y, float a, float b); 

m_a = m_b = 1; 

Ellipse* pE = new Ellipse(2.5, 6.5, 12, 15); Ellipse(const Ellipse & e); }~Ellipse(); // Destructeur 

etc … 

delete pE; // appelle le destructeur pour pE 

protected : 

float m_cX, m_cY; float m_a, m_b; 

return 0; Ellipse::~ Ellipse() { 

// Le destructeur est implicitement appelé pour e. // Libération des ressources 

} public :}void deplace(float dx, float dy); 

void zoom(float z); float surface(); };void Ellipse::deplace(float dx, float dy) 

m_cX += dx; m_cY += dy; }etc … 

 

télécharger gratuitement Programmation Orienté Objet en C++(science 5)

Quitter la version mobile