CoursDocuments

Programmation Orienté Objet en C++(science5)

MODULE : POO 

Enseignant : Mohamed Kharrat Année universitaire 2016/2017 

Séance 5 

C++ : classes 

  • Introduction aux Langages Orientés Objets 
  • Qu’est-ce qu’un objet ? 
  • Propriétés d’un objet 
  • Notion d’héritage et de polymorphisme 
  • Les classes en C++ 

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

Objet? 

  • Objectif? Exemples d’objets une fenêtre ; un bouton ; Une voiture Beaucoup de choses peuvent être considérées comme des objets. Concrètement, c’est quoi ? Une variable ? Une fonction ? 

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

Programmation orientée objet vs programmation impérative 

  • Avantages : 
  • Programmes plus faciles à maintenir 

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

  • Programmation plus claire : les fonctions sont rattachées à un type de données 
  • Modularité accrue -> possibilité de réutiliser le code 

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

  • Un objet est une entité informatique comprenant : 

– 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 … 

  • L’accès aux données et méthodes peut être réglementé : 

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 

  • Un objet possède un état : 

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

  • Un objet est décrit par une classe : 

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. 

  • Un objet possède une identité : 

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 

  • L’héritage permet de définir une hiérarchie de classes : 
  • La classe de base est une classe générique
  • Les classes dérivées sont de plus en plus spécialisées 

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 

  • Supposons que nous déclarions les quatre classes suivantes : Voiture, Moteur, Route et Véhicule. 
  • Quel genre de relation y a-t-il entre la classe Voiture et les trois autres classes ? 

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; 

  • Par convention, on crée un fichier .cpp et un .h ayant le nom de la classe en minuscule. 

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 

  • Le constructeur est une fonction membre qui sert à initialiser les données membres de l’objet Systématiquement appelé quand un objet est instancié. N’a pas de type de retour Porte le nom de l’objet 
  • Une même classe peut avoir plusieurs constructeurs 
  • Constructeurs particuliers : constructeur par défaut Ne contient aucun argument Automatiquement généré si aucun constructeur n’est défini A définir explicitement dans le cas contraire constructeur de copie Contient comme argument un objet du même type Sert à créer des clones d’objets Automatiquement généré par le compilateur (copie membre à membre) mais pas toujours satisfaisant 

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 

  • Fonction membre systématiquement appelée juste avant la destruction d’un objet 
  • Porte le nom de la classe et est précédé de ~ 
  • Pas de type de retour 
  • Pas d’arguments 
  • Un seul par classe 
  • Permet de libérer les ressourcesellipse.h ellipse.cpp prog.cpp 

#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)

Articles similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Bouton retour en haut de la page

Adblock détecté

S'il vous plaît envisager de nous soutenir en désactivant votre bloqueur de publicité