SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
DEA
« Astrophysique et instrumentations associées »



                   C++
      Programmation orientée objet


                     2004
                Benoît Semelin
Références

Il existe de très nombreux tutoriels C++ téléchargeable gratuitement:


     - Pour une liste de tutoriels avec appréciation:
                               http://c.developpez.com/cours/

     - La page personnelle du créateur (en anglais)

                             http://www.research.att.com/~bs/3rd.html

         On y trouve un manuel d'apprentissage téléchageable.
La POO
                  (Programmation orientée objet)

C++, java sont des langages orientés objet.
Qu'est-ce que ça veut dire?
  Les objets sont de nouvelles sortes de variables
  encore plus générales que les types dérivés (ou           Assembleur




                                                                         Abstraction croissante
  structures).
  Leur caractéristique principale: ils acceptent des
  procédures     (fonctions,   subroutines)   comme         C, Fortran
  composantes.
A quoi ça sert?
  Améliorer la lisibilité d'un code en utilisant des
  schémas plus proche du raisonnement humain grâce           C++, java
  aux objets.
  Développer un code au sein d'un grand projet (plusieurs
  développeurs):      assurer     la      robustesse   et
  l'interopérabilité des différentes parties.
Un exemple d'objet
On veut simuler un système physique (p.e. un disque proto-planétaire) par un
ensemble de particules. L'objet de base du programme va être la particule.

Rappel: type dérivé (structure)
            Définition                             Utilisation

        typedef struct {                     vecteur3D pos[100],vel[100];
           double x;                         double   dt;
           double y;
           double z; }                       dt=0.01;
        vecteur3D;                           pos[50].x += vel[50].x*dt;
Déclaration de la classe « particule »:

       Déclaration (prototype)        Description des « méthodes »                  utilisation
   class particule {                   void particule::adv_pos (double dt) {   int main()
          private:                           pos.x += vel.x*dt;                {
            vecteur3D pos,vel;               pos.y += vel.y*dt;                   particule part[100];
            double    mass;                  pos.z += vel.z*dt;                   double dtime;
          public:                      }                                          .......
            void adv_pos (double);                                                for (i=0;i<100;i++)
   };                                                                             {
                                                                                         part[i].adv_pos(dt);
    La classe particule possède 4 membres: 3 variables (pos, vel et mass)         }
    et une méthode, ou ''fonction '' (adv_pos).                                }
Encapsulation de l'objet
class particule {
       private:
         vecteur3D pos,vel;
         double    mass;
       public:
         void adv_pos (double);
};

Les membres d'une classe peuvent avoir plusieurs statuts:
         - private: ils ne sont accessibles qu'aux autres membres de la classe. C'est le statut par défaut
         - public: ils sont accessibles partout où l'objet est déclaré.
         - protected: ils ne sont accessibles aux membres de la classe et des classes descendantes.

Dans notre exemple, la valeur de mass est privée, elle n'est pas accessible
depuis l'extérieur de la classe:
int main()
{
   particule part[100];
   double dtime;

    part[50].mass += 0.01;        <== n'a pas de sens!
}
Pourquoi mettre un membre
         de classe en « private » ?
Précisons tout d'abord que « private » est le statut par défaut d'un membre.

    Un membre « private » est protégé contre une modification incontrôlée de sa valeur
    On peut quand même y accéder en définissant des méthodes spéciales:
       class particule {                      Quel intérêt ?? Juste éviter les modifs incontrôlées ??
              private:
                double     mass;
                                              Non!
              public:
                void set_mass (double);
                double get_mass (void);       On pourrait, dans set_mass, vérifier que la mass est
       };                                     bien positive! Si un autre programmateur utilise
                                              set_mass, il n'aura pas besoin de faire le contrôle lui-
       void particule::set_mass(double x) {   même!
       mass=x;
       }                                      On obtient un code plus robuste pour le développement
                                              à plusieurs.
       double particule::get_mass(void){
       return mass;
       }
Les fonctions amies d'une classe
Il s'agit d'une autre manière d'agir sur les membres « private » d'une classe.

On déclare dans la classe, la liste des fonctions « amies », celles-ci auront un
accès illimité aux membres de la classe. Exemple:
  class particule {
        friend double Ec(int);                           Il ne faut pas abuser des fonctions
                                                         amies: cela va à l'encontre de l'esprit
        vecteur3D pos,vel;
        double    mass;                                  de la programmation objet.
  };
                                                         On peut définir la classe B comme
  double Ec(int i) {
        Ec=0.5*part[i].mass*(pow(part[i].vel.x,2)        amie dans la classe A: toutes les
          +pow(part[i].vel.y,2)+pow(part[i].vel.z,2));   méthodes de B sont alors amies de A:
        return;
  }                                                            class particule {
                                                                       friend class diagnostic;
  int main() {                                                         vecteur3D pos,vel;
                                                                       double      mass;
  particule part[100];                                         };
                                                               class diagnostic {
  .....                                                                public:
  for(i=0;i<100;i++) { cout << Ec(i) << endl;}                         double Ec(int);
                                                                       double Ep(int);
  .....
                                                               };
  }
Constructeur et destructeur
                        d'objet
Il existe 2 méthodes spéciales pour chaque classe, le constructeur et le destructeur. Le
mon des fonctions correspondantes n'est pas libre.

                  Le constructeur:                                         Le destructeur:
       Il est appelé automatiquement à chaque fois              Il est appelé automatiquement quand la
       qu'on déclare un objet (instanciation) de la             portée l'objet s'achève, ou, pour allocation
       classe.                                                  dynamique, au moment de l'appel de delete.

  class particule {                                         class particule {
          private:                                                  private:
             vecteur3D pos,vel;                                        vecteur3D pos,vel;
             double       mass;                                        double       mass;
          public:                                                   public:
              particule (double);   // Constructeur                     ~particule (void); // Destructeur
                                        // pas de type !!                                      // pas de type !!
  };                                                                                           // pas d'argument !!
                                                            };
  particule::particule(double m)
  {                                                         particule::~particule(double m)
        mass = m;                                           {
  }                              // pas de ; !!                     cout << ''Une particule détruite! '' << endl ;
                                                            }                                // pas de ; !!
  particule part(1.);           // Déclaration et appel
                                   // du constructeur
Surcharge de fonction.

Il est possible de donner plusieurs définitions d'une même fonction qui diffèrent
par le type et le nombre d'arguments. Cela s'appelle la surcharge
de fonction. Exemple:

        #include <string>

        void alarme()
        {
              cout << ''Alarme! '' << endl;
        }
        void alarme(string message}
        {
              cout<<''Alarme : '' << message << endl;
        }

Suivant le contexte (type et nombre d'arguments passés à la fonction) le
compilateur détermine quelle version appeler.

La surcharge de fonction peut s'appliquer aux fonctions membres de classes.
Surcharge d'opérateur.
typedef struct {
    double x;                                                       Il est possible d'ajouter une définition
    double y;                                                       (surcharger) aux opérateur classiques (=,
    double z; }
vecteur3D;                                                          +, -, *, /, %, &&, ||, ==, <, ...) pour qu'ils
                                                                    soient capables d'agir sur les objets d'une
class particule {
        private:                                                    classe.
        vecteur3D pos,vel;
        double     mass;
        public:                                                     A gauche, exemple de surcharge de +, à
        particule operator+ (particule);                            l'aide d'une méthode de la classe. Il est
};
                                                                    aussi possible d'utiliser une fonction
particule particule::operator+(particule r) {                       externe.
        particule resultat;
        resultat.pos.x=(pos.x*mass+r.pos.x*r.mass)/(mass+r.mass);
        resultat.pos.y=(pos.y*mass+r.pos.y*r.mass)/(mass+r.mass);   L'opérateur = possède une définition par
        resultat.pos.z=(pos.z*mass+r.pos.z*r.mass)/(mass+r.mass);
        resultat.vel.x=(vel.x*mass+r.vel.x*r.mass)/(mass+r.mass);   défaut !! Il copie les membres un à un
        resultat.vel.y=(vel.y*mass+r.vel.y*r.mass)/(mass+r.mass);   dans les membres correspondants.
        resultat.vel.z=(vel.z*mass+r.vel.z*r.mass)/(mass+r.mass);
        resultat.mass=mass+r.mass;
        return(resultat);
}
int main() {
particule a,b,c;
...
a=b+c;                          /* valide */
a=b.operator+(c);             /* également valide */
....
}
Héritage de classe
Il s'agit d'un aspect essentiel de C++. A partir d'une classe de base (ou classe mère)
on peut définir des classes dérivées (ou classes filles):

      Les classes dérivées possèdent automatiquement les membres de la classe mère.
      Les classes dérivées peuvent définir les propres membres, mais aussi redéfinir les
      méthodes de la classe mère.


       class particule {



                                                  }
              plublic:
                vecteur3D pos,vel;
             protected:                               Classe mère
                double    mass;
              public:
                void adv_pos (double);
       };




                                                  }
       class particule_gaz : public particule {
              protected:
                double temperature;
                double densite;                       Classe fille:
              public:                                 NB: le membre mass de particule_gaz est
                double pression();                    accessible par les méthodes de particule et
       };                                             particule_gaz, c'est tout!
Fin

Más contenido relacionado

La actualidad más candente

Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Cours Programmation Orientée Objet en C++
Cours Programmation Orientée Objet en C++Cours Programmation Orientée Objet en C++
Cours Programmation Orientée Objet en C++Amina HAMEURLAINE
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionECAM Brussels Engineering School
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesECAM Brussels Engineering School
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Les listes simplement chaînées en langage C
Les listes simplement chaînées en langage CLes listes simplement chaînées en langage C
Les listes simplement chaînées en langage CMohamed Lahby
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeAmir Souissi
 
Les structures de données.pptx
Les structures de données.pptxLes structures de données.pptx
Les structures de données.pptxPROFPROF11
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 

La actualidad más candente (20)

TP C++ : Correction
TP C++ : CorrectionTP C++ : Correction
TP C++ : Correction
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Chapitre 01 - Notions de base
Chapitre 01 - Notions de baseChapitre 01 - Notions de base
Chapitre 01 - Notions de base
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
Cours Programmation Orientée Objet en C++
Cours Programmation Orientée Objet en C++Cours Programmation Orientée Objet en C++
Cours Programmation Orientée Objet en C++
 
Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Les listes en Python
Les listes en PythonLes listes en Python
Les listes en Python
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Récursivité
RécursivitéRécursivité
Récursivité
 
Les listes simplement chaînées en langage C
Les listes simplement chaînées en langage CLes listes simplement chaînées en langage C
Les listes simplement chaînées en langage C
 
Python avancé : Tuple et objet
Python avancé : Tuple et objetPython avancé : Tuple et objet
Python avancé : Tuple et objet
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
Les structures de données.pptx
Les structures de données.pptxLes structures de données.pptx
Les structures de données.pptx
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 

Destacado

STM32F4+Android Application
STM32F4+Android ApplicationSTM32F4+Android Application
STM32F4+Android ApplicationHajer Dahech
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en cbenouini rachid
 
C Plus Plus demo
C Plus Plus demoC Plus Plus demo
C Plus Plus demopadnot
 
Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Fred Brunel
 
Programmation des pic_en_c_part2
Programmation des pic_en_c_part2Programmation des pic_en_c_part2
Programmation des pic_en_c_part2oussamada
 
Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Karim Touati
 
Généralités sur les périphériques du STM32
Généralités sur les périphériques du STM32Généralités sur les périphériques du STM32
Généralités sur les périphériques du STM32Hajer Dahech
 
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1Programmation des pic_en_c_part1
Programmation des pic_en_c_part1oussamada
 
Microcontroleur Pic16 F84
Microcontroleur Pic16 F84Microcontroleur Pic16 F84
Microcontroleur Pic16 F84guest1e7b02
 
chap1 generalites_signaux-systemes
chap1 generalites_signaux-systemeschap1 generalites_signaux-systemes
chap1 generalites_signaux-systemesBAKKOURY Jamila
 
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATURE
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATUREARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATURE
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATUREHajer Dahech
 

Destacado (20)

STM32F4+Android Application
STM32F4+Android ApplicationSTM32F4+Android Application
STM32F4+Android Application
 
Cours de c
Cours de cCours de c
Cours de c
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en c
 
Séries de Fourier
Séries de FourierSéries de Fourier
Séries de Fourier
 
C Plus Plus demo
C Plus Plus demoC Plus Plus demo
C Plus Plus demo
 
Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)
 
Compteur ARDUINO
Compteur ARDUINOCompteur ARDUINO
Compteur ARDUINO
 
Pic16f84
Pic16f84Pic16f84
Pic16f84
 
TP C++ : enoncé
TP C++ : enoncéTP C++ : enoncé
TP C++ : enoncé
 
Programmation des pic_en_c_part2
Programmation des pic_en_c_part2Programmation des pic_en_c_part2
Programmation des pic_en_c_part2
 
Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)Micocontroleur16 fxxx (1)
Micocontroleur16 fxxx (1)
 
Généralités sur les périphériques du STM32
Généralités sur les périphériques du STM32Généralités sur les périphériques du STM32
Généralités sur les périphériques du STM32
 
Programmation des pic_en_c_part1
Programmation des pic_en_c_part1Programmation des pic_en_c_part1
Programmation des pic_en_c_part1
 
Microcontroleur Pic16 F84
Microcontroleur Pic16 F84Microcontroleur Pic16 F84
Microcontroleur Pic16 F84
 
Cours pics16 f877
Cours pics16 f877Cours pics16 f877
Cours pics16 f877
 
chap1 generalites_signaux-systemes
chap1 generalites_signaux-systemeschap1 generalites_signaux-systemes
chap1 generalites_signaux-systemes
 
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATURE
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATUREARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATURE
ARDUINO + LABVIEW : CONTRÔLE DE LA TEMPÉRATURE
 
Microcontroleur
MicrocontroleurMicrocontroleur
Microcontroleur
 
CP 151013
CP 151013CP 151013
CP 151013
 
Bac 2012 SVT
Bac 2012 SVTBac 2012 SVT
Bac 2012 SVT
 

Similar a Cours c++

Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objetAmir Souissi
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieCorrection TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieMariem ZAOUALI
 
Diagramme de Classe
Diagramme de ClasseDiagramme de Classe
Diagramme de ClasseabdoMarocco
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
Chap 03 poo en java partie2
Chap 03 poo en java partie2Chap 03 poo en java partie2
Chap 03 poo en java partie2Yassine Badri
 

Similar a Cours c++ (20)

POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Chapitre3 2013 POO
Chapitre3 2013 POOChapitre3 2013 POO
Chapitre3 2013 POO
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
POO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdfPOO-JAVA-partie-1.pdf
POO-JAVA-partie-1.pdf
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Memo java
Memo javaMemo java
Memo java
 
Qc mcorrige
Qc mcorrigeQc mcorrige
Qc mcorrige
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
Cours de JAVA de base
Cours de JAVA  de baseCours de JAVA  de base
Cours de JAVA de base
 
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieCorrection TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
2006 2007-heritage-en-c++
2006 2007-heritage-en-c++2006 2007-heritage-en-c++
2006 2007-heritage-en-c++
 
XB-Java.ppt
XB-Java.pptXB-Java.ppt
XB-Java.ppt
 
Diagramme de Classe
Diagramme de ClasseDiagramme de Classe
Diagramme de Classe
 
Ch03
Ch03Ch03
Ch03
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Part1
Part1Part1
Part1
 
Chap 03 poo en java partie2
Chap 03 poo en java partie2Chap 03 poo en java partie2
Chap 03 poo en java partie2
 

Cours c++

  • 1. DEA « Astrophysique et instrumentations associées » C++ Programmation orientée objet 2004 Benoît Semelin
  • 2. Références Il existe de très nombreux tutoriels C++ téléchargeable gratuitement: - Pour une liste de tutoriels avec appréciation: http://c.developpez.com/cours/ - La page personnelle du créateur (en anglais) http://www.research.att.com/~bs/3rd.html On y trouve un manuel d'apprentissage téléchageable.
  • 3. La POO (Programmation orientée objet) C++, java sont des langages orientés objet. Qu'est-ce que ça veut dire? Les objets sont de nouvelles sortes de variables encore plus générales que les types dérivés (ou Assembleur Abstraction croissante structures). Leur caractéristique principale: ils acceptent des procédures (fonctions, subroutines) comme C, Fortran composantes. A quoi ça sert? Améliorer la lisibilité d'un code en utilisant des schémas plus proche du raisonnement humain grâce C++, java aux objets. Développer un code au sein d'un grand projet (plusieurs développeurs): assurer la robustesse et l'interopérabilité des différentes parties.
  • 4. Un exemple d'objet On veut simuler un système physique (p.e. un disque proto-planétaire) par un ensemble de particules. L'objet de base du programme va être la particule. Rappel: type dérivé (structure) Définition Utilisation typedef struct { vecteur3D pos[100],vel[100]; double x; double dt; double y; double z; } dt=0.01; vecteur3D; pos[50].x += vel[50].x*dt; Déclaration de la classe « particule »: Déclaration (prototype) Description des « méthodes » utilisation class particule { void particule::adv_pos (double dt) { int main() private: pos.x += vel.x*dt; { vecteur3D pos,vel; pos.y += vel.y*dt; particule part[100]; double mass; pos.z += vel.z*dt; double dtime; public: } ....... void adv_pos (double); for (i=0;i<100;i++) }; { part[i].adv_pos(dt); La classe particule possède 4 membres: 3 variables (pos, vel et mass) } et une méthode, ou ''fonction '' (adv_pos). }
  • 5. Encapsulation de l'objet class particule { private: vecteur3D pos,vel; double mass; public: void adv_pos (double); }; Les membres d'une classe peuvent avoir plusieurs statuts: - private: ils ne sont accessibles qu'aux autres membres de la classe. C'est le statut par défaut - public: ils sont accessibles partout où l'objet est déclaré. - protected: ils ne sont accessibles aux membres de la classe et des classes descendantes. Dans notre exemple, la valeur de mass est privée, elle n'est pas accessible depuis l'extérieur de la classe: int main() { particule part[100]; double dtime; part[50].mass += 0.01; <== n'a pas de sens! }
  • 6. Pourquoi mettre un membre de classe en « private » ? Précisons tout d'abord que « private » est le statut par défaut d'un membre. Un membre « private » est protégé contre une modification incontrôlée de sa valeur On peut quand même y accéder en définissant des méthodes spéciales: class particule { Quel intérêt ?? Juste éviter les modifs incontrôlées ?? private: double mass; Non! public: void set_mass (double); double get_mass (void); On pourrait, dans set_mass, vérifier que la mass est }; bien positive! Si un autre programmateur utilise set_mass, il n'aura pas besoin de faire le contrôle lui- void particule::set_mass(double x) { même! mass=x; } On obtient un code plus robuste pour le développement à plusieurs. double particule::get_mass(void){ return mass; }
  • 7. Les fonctions amies d'une classe Il s'agit d'une autre manière d'agir sur les membres « private » d'une classe. On déclare dans la classe, la liste des fonctions « amies », celles-ci auront un accès illimité aux membres de la classe. Exemple: class particule { friend double Ec(int); Il ne faut pas abuser des fonctions amies: cela va à l'encontre de l'esprit vecteur3D pos,vel; double mass; de la programmation objet. }; On peut définir la classe B comme double Ec(int i) { Ec=0.5*part[i].mass*(pow(part[i].vel.x,2) amie dans la classe A: toutes les +pow(part[i].vel.y,2)+pow(part[i].vel.z,2)); méthodes de B sont alors amies de A: return; } class particule { friend class diagnostic; int main() { vecteur3D pos,vel; double mass; particule part[100]; }; class diagnostic { ..... public: for(i=0;i<100;i++) { cout << Ec(i) << endl;} double Ec(int); double Ep(int); ..... }; }
  • 8. Constructeur et destructeur d'objet Il existe 2 méthodes spéciales pour chaque classe, le constructeur et le destructeur. Le mon des fonctions correspondantes n'est pas libre. Le constructeur: Le destructeur: Il est appelé automatiquement à chaque fois Il est appelé automatiquement quand la qu'on déclare un objet (instanciation) de la portée l'objet s'achève, ou, pour allocation classe. dynamique, au moment de l'appel de delete. class particule { class particule { private: private: vecteur3D pos,vel; vecteur3D pos,vel; double mass; double mass; public: public: particule (double); // Constructeur ~particule (void); // Destructeur // pas de type !! // pas de type !! }; // pas d'argument !! }; particule::particule(double m) { particule::~particule(double m) mass = m; { } // pas de ; !! cout << ''Une particule détruite! '' << endl ; } // pas de ; !! particule part(1.); // Déclaration et appel // du constructeur
  • 9. Surcharge de fonction. Il est possible de donner plusieurs définitions d'une même fonction qui diffèrent par le type et le nombre d'arguments. Cela s'appelle la surcharge de fonction. Exemple: #include <string> void alarme() { cout << ''Alarme! '' << endl; } void alarme(string message} { cout<<''Alarme : '' << message << endl; } Suivant le contexte (type et nombre d'arguments passés à la fonction) le compilateur détermine quelle version appeler. La surcharge de fonction peut s'appliquer aux fonctions membres de classes.
  • 10. Surcharge d'opérateur. typedef struct { double x; Il est possible d'ajouter une définition double y; (surcharger) aux opérateur classiques (=, double z; } vecteur3D; +, -, *, /, %, &&, ||, ==, <, ...) pour qu'ils soient capables d'agir sur les objets d'une class particule { private: classe. vecteur3D pos,vel; double mass; public: A gauche, exemple de surcharge de +, à particule operator+ (particule); l'aide d'une méthode de la classe. Il est }; aussi possible d'utiliser une fonction particule particule::operator+(particule r) { externe. particule resultat; resultat.pos.x=(pos.x*mass+r.pos.x*r.mass)/(mass+r.mass); resultat.pos.y=(pos.y*mass+r.pos.y*r.mass)/(mass+r.mass); L'opérateur = possède une définition par resultat.pos.z=(pos.z*mass+r.pos.z*r.mass)/(mass+r.mass); resultat.vel.x=(vel.x*mass+r.vel.x*r.mass)/(mass+r.mass); défaut !! Il copie les membres un à un resultat.vel.y=(vel.y*mass+r.vel.y*r.mass)/(mass+r.mass); dans les membres correspondants. resultat.vel.z=(vel.z*mass+r.vel.z*r.mass)/(mass+r.mass); resultat.mass=mass+r.mass; return(resultat); } int main() { particule a,b,c; ... a=b+c; /* valide */ a=b.operator+(c); /* également valide */ .... }
  • 11. Héritage de classe Il s'agit d'un aspect essentiel de C++. A partir d'une classe de base (ou classe mère) on peut définir des classes dérivées (ou classes filles): Les classes dérivées possèdent automatiquement les membres de la classe mère. Les classes dérivées peuvent définir les propres membres, mais aussi redéfinir les méthodes de la classe mère. class particule { } plublic: vecteur3D pos,vel; protected: Classe mère double mass; public: void adv_pos (double); }; } class particule_gaz : public particule { protected: double temperature; double densite; Classe fille: public: NB: le membre mass de particule_gaz est double pression(); accessible par les méthodes de particule et }; particule_gaz, c'est tout!
  • 12. Fin