Programmation Orienté Objet en C++(science5)

1/1
100%
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é : 

Publicité

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. 

Publicité

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)
Page 1 sur 1Lecteur de document UniversityLib

Programmation Orienté Objet en C++(science5)

Informatique · course

Browse all programmation documents

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é : 

Advertisement

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. 

Advertisement

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)