SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
Programmation Orientée Objet en C++
      9ème Partie: Fonctions Membres



              Fabio Hernandez
            Fabio.Hernandez@in2p3.fr
Vue d'Ensemble
   Notions de base
   Types, variables, opérateurs
   Contrôle d'exécution
   Fonctions
   Mémoire dynamique
   Qualité du logiciel
   Evolution du modèle objet
   Objets et classes
   Fonctions membres
   Classes génériques
   Héritage
   Polymorphisme
   Héritage multiple
   Entrée/sortie


POO en C++: Fonctions Membres        257         © 1997-2003 Fabio HERNANDEZ
Table des Matières

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres          258           © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline

   On peut classer les fonctions membres par rapport à leur
   mission vis-à-vis de la classe
         gestion (construction, destruction, copie, ...)
         modification de l'état
         consultation de l'état (attributs) de l'objet
         fonctions d'aide
         itération, pour les classes d'objets qui sont des conteneurs d'autres
         objets
         opérateurs (affectation, comparaison, ...)
   L ’objectif de quelques-unes d ’entre elles est de permettre la
   consultation des attributs, tout en gardant l ’encapsulation
         le corps de la fonction membre est petit



POO en C++: Fonctions Membres          259                  © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline

   C++ fournit un mécanisme pour que l ’exécution de ces fonctions
   membres ne soit pas pénalisante en termes de performance
   Le mot clé inline suggère au compilateur de remplacer l ’appel
   par le corps même de la fonction
   Exemple
         la classe Point définie précédemment fournit deux fonctions membres
         pour accéder aux attributs (coordonnées cartésiennes) d ’un objet de la
         classe
         ce sont des candidates à être des fonctions inline




POO en C++: Fonctions Membres          260                 © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline (suite)
          class Point {
          public:
             // Constructors
             ...
             // Modifiers
             ...

                // Selectors
                float getX() const;
                float getY() const;
                ...
          private:
             // Data members
             float x_;
             float y_;
          };

POO en C++: Fonctions Membres         261   © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline (suite)

   Nous avions défini les fonctions membres x() et y() dans le
   fichier Point.cpp comme suit
          float Point::getX() const
          {
             return x_;
          }

          float Point::getY() const
          {
             return y_;
          }
   Pour que le compilateur puisse optimiser l ’appel à ces fonctions
   membres nous devons
         ajouter le mot clé inline à la définition de la fonction
         mettre l'implémentation de la fonction dans le fichier Point.h

POO en C++: Fonctions Membres         262                  © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline (suite)

   En plus de l ’interface de la classe, le fichier Point.h
   contiendra la définition de toutes les fonctions membres de
   type inline

          inline float Point::getX() const      Le mot clé inline
          {                                       est rajouté à la
             return x_;                           définition de la
          }                                      fonction membre
          inline float Point::getY() const
          {
             return y_;
          }




POO en C++: Fonctions Membres   263             © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline (suite)

   Lors de l ’utilisation d ’une de ces fonctions membres
          Point p(18.0, 70.0);
          float offset = p.getX();
   le compilateur "remplace" l ’appel à la fonction membre
   Point::x() par le corps de la fonction, comme si nous avions
   écrit
          float offset = p.x_;
   Avantages
         amélioration des performances
         préservation de l ’encapsulation
   Inconvénients
         le fichier .h de la classe peut devenir gros, ce qui ralentit la compilation
         peut poser des problèmes à certains déboguers


POO en C++: Fonctions Membres            264                  © 1997-2003 Fabio HERNANDEZ
Fonctions membres inline (suite)

   Autre façon consiste à définir le corps de la fonction membre
   dans la déclaration de l ’interface de la classe
          class Point {
          public:
             ...

                // Selectors
                float getX() const {return x_;};   // Not recommended
                float getY() const {return y_;};
                ...
          private:
             ...
          };
   Gros inconvénient: pollution de l ’interface

POO en C++: Fonctions Membres      265              © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        266        © 1997-2003 Fabio HERNANDEZ
Arguments par défaut

   C++ permet de définir la valeur par défaut des arguments des
   fonctions (membres et non membres)
   Si l ’on appelle la fonction sans ou avec une liste partielle
   d ’arguments, le compilateur rajoutera les arguments qui
   manquent avec les valeurs qui ont été spécifiées par défaut
   Exemple: on modifie l ’interface de la classe Point comme
          class Point {
          public:
             ...
             // Modifiers
             void translate(float horizontal = 1.0,                 Arguments
                            float vertical = 1.0);                  par défaut
             ...
          };

POO en C++: Fonctions Membres           267            © 1997-2003 Fabio HERNANDEZ
Arguments par défaut (suite)

   Nous pouvons maintenant utiliser cette fonction membre comme
           Point p(10.8, 30.4);
           p.translate();       // p.translate(1.0, 1.0);
           p.translate(5.0);    // p.translate(5.0, 1.0);
           p.translate(6.9, 7.0);
   La possibilité de spécifier des arguments par défaut est utile
   pour fournir une façon abrégée d ’utiliser une fonction membre
   avec les arguments les plus souvent utilisés
         attributs de création d’une fenêtre
         chaîne nulle
         valeurs booléens
         …


POO en C++: Fonctions Membres          268       © 1997-2003 Fabio HERNANDEZ
Arguments par défaut (suite)

   Inconvénient: le texte du programme peut devenir confus
         il est plus claire si on lit
             p.translate(1.0, 1.0);
         que
           p.translate();
         même si le résultat en exécution est identique




POO en C++: Fonctions Membres          269                © 1997-2003 Fabio HERNANDEZ
Arguments par défaut (suite)

   Les constructeurs peuvent aussi avoir des arguments par défaut
          class Point {
          public:
             // Constructors/Destructor
             Point(float initialX = 0.0 , float initialY = 0.0 );
             Point(const Point& aPoint);
             ~Point();
             ...
          };




POO en C++: Fonctions Membres   270             © 1997-2003 Fabio HERNANDEZ
Arguments par défaut (suite)

   Ceci offre la possibilité de construire un objet de cette classe
   de plusieurs façons différentes, toutes faisant appel au même
   constructeur
          Point origin;                // Point::Point(0.0, 0.0)
          Point unit(1.0);             // Point::Point(1.0, 0.0)
          Point start(15.9, 45.3);
   Notez que l ’implémentation de la classe (fichier .cpp) n ’est
   pas modifiée: uniquement son interface (fichier .h)




POO en C++: Fonctions Membres    271               © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        272        © 1997-2003 Fabio HERNANDEZ
Le pointeur this

   Dans certains cas, il est nécessaire dans le corps d'une fonction
   membre de faire référence explicite à l'objet sur lequel la
   fonction membre s'applique
   Toutes les fonctions membres en C++ ont accès à un pointeur à
   l'objet via le mot clé this
   Exemple: on peut écrire la fonction membre translate de la
   classe Point comme
          void Point::translate(float horizontal, float vertical)
          {
             this->x_ += horizontal;
             this->y_ += vertical;
          };


POO en C++: Fonctions Membres         273          © 1997-2003 Fabio HERNANDEZ
Le pointeur this (suite)

   this est un pointeur à un objet de la classe Point qui ne peut
   pas être modifié
          void Point::translate(float horizontal, float vertical)
          {
             this = 0; // COMPILATION ERROR: "this" is constant
          }
   Ceci est vrai pour n'importe quelle classe
   this existe uniquement dans le contexte d'une fonction
   membre
   A quoi sert-il? Un exemple de son utilité dans le chapitre
   suivant


POO en C++: Fonctions Membres       274          © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        275        © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs

   Avec les outils du langage étudiés jusqu'à présent nous pouvons
   définir des nouvelles classes, créer des objets de ces classes et
   les manipuler presque comme les objets des types primitifs
   Néanmoins, avec des objets des types primitifs
          int count;
          int threshold;
   nous pouvons écrire
          if (count == threshold) {
             ...
          }
          if (count < 10000) {
             ...
          }


POO en C++: Fonctions Membres     276            © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Autrement dit, on peut utiliser les opérateurs arithmétiques et
   logiques qui sont prédéfinis par le langage
   C++ offre au programmeur la possibilité de définir la plupart
   d'opérateurs pour une classe quelconque
   Exemple: pour comparer deux objets de la classe Point nous
   avons défini la fonction membre

          bool Point::isEqualTo(const Point& aPoint) const
          {
             return (x_ == aPoint.x_) && (y_ == aPoint.y_);
          }



POO en C++: Fonctions Membres   277             © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Ceci nous permet de comparer deux objets de la classe Point
   comme
          Point origin;
          Point target(15.0, 18.0);
          ...
          if ( target.isEqualTo(origin) ) {
             // do something when they are equal
          }
   Il est souhaitable de pouvoir comparer ces deux objets de la
   même façon que l'on compare deux objets d'un type primitif
          if (target == origin) {
             // do something when they are equal
          }

POO en C++: Fonctions Membres   278                © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Nous allons donc redéfinir l'opérateur d'égalité "==" pour les
   objets de la classe Point
    Tout d'abord, il faut modifier l'interface de la classe
          class Point {
          public:
             // Constructors/Destructor
             ...

                // Operators
                bool operator==(const Point& aPoint) const;
                ...
          private:
             ...
          };

POO en C++: Fonctions Membres      279             © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Ensuite, il faut écrire l'implémentation de cette nouvelle
   fonction membre
          bool Point::operator==(const Point& aPoint) const
          {
             return (x_ == aPoint.x_) && (y_ == aPoint.y_);
          }
   Nous pouvons maintenant utiliser cet opérateur
          Point origin;
          Point target(15.0, 18.0);
          ...
          if (target == origin) {
             // do something when they are equal
          }

POO en C++: Fonctions Membres   280                © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Ceci est équivalent à
          if ( target.operator==(origin) ) {
              // do something when they are equal
          }
         l'opérateur de comparaison s'applique à l'objet target avec comme
         argument l'objet origin
   Notez la différence avec
          if (origin == target) {
             ...
          }
   qui est équivalent à
          if ( origin.operator==(target) ) {
             ...
          }
POO en C++: Fonctions Membres         281                 © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Surcharge de l'opérateur d'inégalité
          class Point {
          public:
             // Constructors/Destructor
             ...

                // Operators
                bool operator==(const Point& aPoint) const;
                bool operator!=(const Point& aPoint) const;
                ...
          private:
             ...
          };


POO en C++: Fonctions Membres      282             © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Pour l'implémentation on peut utiliser l'opérateur de
   comparaison déjà défini

          inline bool Point::operator!=(const Point& aPoint) const
          {
             return (*this == aPoint) ? false : true;
          }
   Il est désormais possible d'écrire
          Point origin;
          Point target(15.0, 18.0);
          ...
          if (target != origin) {
             // do something when they are different
          }

POO en C++: Fonctions Membres   283              © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Limitations
         uniquement un ensemble prédéfini d'opérateurs peuvent être surchargés
         impossible d'introduire de nouveaux opérateurs (** par exemple)
         la signification prédéfinie des opérateurs des types primitifs ne peut pas
         être modifiée
         la précédence des opérations n'est pas modifiée, indépendamment du
         type (classe) des opérandes
   Avantages
         traitement uniforme des objets appartenant aux classes définies par le
         programmeur et des objets des types primitifs
         lisibilité du code
   Inconvénient
         peut se prêter à confusion si utilisé sans discrimination

POO en C++: Fonctions Membres           284                  © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Quels sont les opérateurs qui peuvent être surchargés?
         +               !      <<         %=             ->
         -               ,      >>         ^=             ->*
         *               =      ==         &=             new
         /               <      !=         |=             delete
         %               >      &&         *=
         ^               <=     ||         <<
         &               >=     +=         >>
         |               ++     -=         []
         ~               --     /=         ()




POO en C++: Fonctions Membres        285        © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Surcharge de l'opérateur d'affectation
          class Point {
          public:
             // Constructors/Destructor
             ...

                // Operators
                bool operator==(const Point& aPoint) const;
                bool operator!=(const Point& aPoint) const;
                Point& operator=(const Point& aPoint);
                ...
          private:
             ...
          };

POO en C++: Fonctions Membres      286             © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Surcharge de l'opérateur d'affectation (suite)

          Point& Point::operator=(const Point& aPoint)
          {
             if (this == &aPoint)
                return *this;
                                          Affectation de
                x_ = aPoint.x_;
                                        tous les attributs à
                y_ = aPoint.y_;              partir de
                return *this;               l'argument
          }




POO en C++: Fonctions Membres     287                 © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Si l'on veut affecter un objet de la classe Point on peut
   désormais écrire
          Point origin;
          Point target(13.0, 15.0);
          ...
          target = origin;   // target.operator=(origin);
   Surcharge de l'opérateur de sortie
         avec des variables des types primitifs nous pouvons écrire
          int count = 150;
          ...
          cout << "count = " << count << endl;
         nous voulons pouvoir faire pareil pour les objets de la classe Point
          cout << "target = " << target << endl;

POO en C++: Fonctions Membres           288                 © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Surcharge de l'opérateur de sortie (suite)
         et que sur l'écran apparaîsse
          target = [13.0, 15.0]
   Ceci est possible si l'on surcharge l'opérateur de sortie <<
   Cet opérateur ne peut pas être une fonction membre de la
   classe Point
         il a besoin d'un objet de la classe ostream (dans l'exemple cout)
         comme premier argument
         équivalent à
           cout.operator<<(target)
         toute fonction membre de la classe Point est appliqué sur un objet de
         cette classe


POO en C++: Fonctions Membres            289              © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   On peut donc définir cet opérateur comme une fonction non-
   membre associée à la classe Point et implémentée dans le
   fichier Point.cpp
          #include <iostream>

          ostream& operator<<(ostream& stream,
                              const Point& aPoint)
          {
             stream << '[‘
                    << aPoint.getX()
                    << ','
                    << aPoint.getY()
                    << ']';
             return stream;
          }
POO en C++: Fonctions Membres   290             © 1997-2003 Fabio HERNANDEZ
Surcharge des opérateurs (suite)

   Le fichier Point.h contiendra, en plus de l'interface de la
   classe, la déclaration du prototype de la fonction non-membre
          #include <iostream>

          class Point {
          public:
             ...

          private:
             ...
          };
          extern ostream& operator<<(ostream& stream,
                                     const Point& aPoint);



POO en C++: Fonctions Membres    291            © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        292        © 1997-2003 Fabio HERNANDEZ
Fonctions amies

   La fonction non-membre opérateur << a besoin des valeurs des
   coordonnées x et y d'un objet Point
   Elle utilise les fonctions membres fournies par la classe pour
   accéder aux attributs de l'objet (Point::getX() et
   Point::getY())
   Si l'opérateur avait accès directe aux attributs x_ et y_ de
   l'objet il n'aurait pas besoin d'appeler les fonctions membres
   Mais les attributs sont privés, donc inaccessibles pour une
   fonction non-membre de la classe
   En C++ on peut définir des fonctions (ou des classes) amies
   d'une classe


POO en C++: Fonctions Membres         293         © 1997-2003 Fabio HERNANDEZ
Fonctions amies (suite)

   Une fonction (ou objet d'une classe) amie a accès à tous les
   attributs de l'objet, indépendamment du contrôle d'accès
   défini par la classe
   Les fonctions (ou classes) amies sont déclarées comme telles
   dans l'interface de la classe




POO en C++: Fonctions Membres         294         © 1997-2003 Fabio HERNANDEZ
Fonctions amies (suite)
          #include <iostream>

          class Point {
          public:
              // Constructors/Destructor
             ...

               // Operators
               friend ostream& operator<<(ostream& stream,
                                          const Point& aPoint);

               // Modifiers
               ...
               // Selectors
               ...

          private:
             ...
          };


POO en C++: Fonctions Membres         295              © 1997-2003 Fabio HERNANDEZ
Fonctions amies (suite)

   On peut donc reécrire l'opérateur de sortie dans le fichier
   Point.cpp
          #include "Point.h"

          ostream& operator<<(ostream& stream,
                              const Point& aPoint)
          {
             stream << '[‘
                    << aPoint.x_
                    << ','
                    << aPoint.y_
                    << ']';
             return stream;
          }

POO en C++: Fonctions Membres         296         © 1997-2003 Fabio HERNANDEZ
Fonctions amies (suite)

   Avantages
         moyen de contourner les mécanismes de contrôle d'accès
         utile dans les cas où il est nécessaire, pour des raisons de performance
         d'accéder, aux attributs privés d'un objet sans danger
   Inconvénients
         moyen de contourner les mécanismes de contrôle d'accès
         fort couplage entre les classes (fonctions) amies
         modifications peuvent être difficiles




POO en C++: Fonctions Membres           297                 © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        298        © 1997-2003 Fabio HERNANDEZ
Données membres statiques

   Il est parfois nécessaire de partager une même valeur par tous
   les objets d'une classe
         une condition
         un compteur associé à la classe qui est modifié au fur et à mesure que
         l'exécution du programme se poursuit
         une valeur constante
   Il est plus efficace d'avoir une seule variable ou constante pour
   tous les objets de la classe au lieu d'une par chaque instance
   (objet)
   Une donnée membre statique peut être vue comme une variable
   globale à la classe à laquelle elle appartient



POO en C++: Fonctions Membres          299                  © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Exemple: supposons qu'il est nécessaire de connaître le nombre
   d'objets de la classe Point actifs à un moment donné
         nous avons besoin d'un compteur au niveau de la classe Point
         ceci est modélisé comme une donnée membre statique

          class Point {
          public:
             ...
          private:
             float x_;
             float y_;
             static int instanceCounter_;
          };




POO en C++: Fonctions Membres          300                  © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   L'implémentation des constructeurs et du destructeur sont
   modifiées
          Point::Point()
          {
             x_ = 0.0;
             y_ = 0.0;
             ++instanceCounter_;
          }

          // similarly for the other constructors

          Point::~Point()
          {
             --instanceCounter_;
          }



POO en C++: Fonctions Membres      301          © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Il est nécessaire aussi de donner une valeur initiale à cette
   donnée membre
         dans le fichier Point.cpp

          int Point::instanceCounter_ = 0;


   On pourrait ajouter une fonction membre pour accéder au
   compteur d'instances

          inline int Point::numberOfInstances() const
          {
             return instanceCounter_;
          }

POO en C++: Fonctions Membres        302          © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Notez que l'accès à une donnée membre statique est le même
   que pour les autres attributs de l'objet
   Les mécanismes de contrôle d'accès sont aussi respectés
   Quel est le résultat de l'exécution du code ci-dessous?
          Point p(15.0, 45.0);
          cout << "Number of instances: "
               << p.numberOfInstances()
               << endl;
          Point q;
          cout << "Number of instances: "
               << q.numberOfInstances()
               << endl;


POO en C++: Fonctions Membres   303           © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Une autre utilisation des données membres statiques est la
   définition de constantes
   Nous pourrions définir un ensemble de constantes physiques
   et/ou mathématiques dans une classe
          class PhysicalConstants {
          public:
             static const double LightSpeed;
             static const double Gravitational;
             static const double Boltzmann;
             ...
          };




POO en C++: Fonctions Membres   304               © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Définition de constantes à l'intérieur d'une classe (suite)

          class MathConstants {
          public:
             static const double Pi;
             ...
          };




POO en C++: Fonctions Membres   305               © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Il faut leur donner les valeurs initiales correspondantes (fichier
   PhysicalConstants.cpp et MathConstants.cpp)

          const double PhysicalConstants::LightSpeed=3.00e8;
          const double PhysicalConstants::Gravitational=6.67e-11;
          const double PhysicalConstants::Boltzmann=1.38e-23;

          const double MathConstants::Pi=3.1415926535;




POO en C++: Fonctions Membres   306               © 1997-2003 Fabio HERNANDEZ
Données membres statiques (suite)

   Et pour utiliser ces constantes
          #include "MathConstants.h"
          float Point::theta()
          {
             if (x_ == 0.0) {               // WARNING: not very safe
                if (y_ == 0.0)
                   return 0.0;

                     const float Pi = MathConstants::Pi;
                     return (y_ > 0.0) ? 0.5*Pi : 1.5*Pi;
                }

                return atan(y_/x_);
          }


POO en C++: Fonctions Membres         307            © 1997-2003 Fabio HERNANDEZ
Contrôle d'Avancement

   Fonctions membres inline
   Arguments par défaut
   Le pointeur this
   Surcharge des opérateurs
   Fonctions amies
   Données membres statiques
   Fonctions membres statiques
   Résumé




POO en C++: Fonctions Membres        308        © 1997-2003 Fabio HERNANDEZ
Fonctions membres statiques (suite)

   Intuitivement, la fonction membre pour obtenir le nombre
   d'instances de la classe Point devrait être attachée à la
   classe elle même et non à une instance particulière
   De la même façon que l'on définit des données membres
   (constantes ou pas), on peut définir des fonctions membres
   statiques
   Une fonction de ce type est associée à la classe et non pas à
   une instance
         pas de référence implicite ou explicite au pointeur this
         l'appel à une de ces fonctions suppose une syntaxe particulière




POO en C++: Fonctions Membres          309                  © 1997-2003 Fabio HERNANDEZ
Fonctions membres statiques (suite)

          class Point {
          public:
             //Constructors/Destructor
             ...

                // Selectors
                static int numberOfInstances();
                ...

                // Modifiers
                ...

          private:
             float x_;
             float y_;
             static int instanceCounter_;
          };

POO en C++: Fonctions Membres       310           © 1997-2003 Fabio HERNANDEZ
Fonctions membres statiques (suite)

   La définition de la fonction est identique que dans le cas non
   statique sauf pour le const

          inline int Point::numberOfInstances()
          {
             return instanceCounter_;
          }
   L'utilisation varie
          Point p(15.0, 45.0);
          cout << "Number of instances: "
               << Point::numberOfInstances()
               << endl;



POO en C++: Fonctions Membres    311              © 1997-2003 Fabio HERNANDEZ
Résumé

   Les fonctions inline permettent de remplacer les appels aux
   fonctions membres tout en conservant l'encapsulation
   On peut spécifier des arguments par défaut pour des fonctions
   (membres et non-membres)
   Les fonctions membres d'une classe ont accès à l'objet sur
   lequel elles s'appliquent via le pointeur this
   Les opérateurs arithmétiques et logiques peuvent être
   redéfinis pour chaque classe créée par le programmeur
   Les fonctions et classes amies offrent un moyen de contourner
   le contrôle d'accès
   Des données et fonctions globales à une classe peuvent être
   définies

POO en C++: Fonctions Membres     312          © 1997-2003 Fabio HERNANDEZ

Contenu connexe

Tendances

Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Merise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMerise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMajid CHADAD
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
exercices Corrigées du merise
exercices Corrigées du  meriseexercices Corrigées du  merise
exercices Corrigées du meriseYassine Badri
 
Correction de td poo n2
Correction de td poo n2Correction de td poo n2
Correction de td poo n2yassine kchiri
 
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
 
Exercice java vehicule
Exercice java vehiculeExercice java vehicule
Exercice java vehiculeNadaBenLatifa
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 
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
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
résumé POO java .pdf
résumé POO java .pdfrésumé POO java .pdf
résumé POO java .pdfImaneZoubir1
 
Poo en c++ les relations entre classes
Poo en c++ les relations entre classesPoo en c++ les relations entre classes
Poo en c++ les relations entre classesAmina HAMEURLAINE
 

Tendances (20)

Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
TP C++ : Correction
TP C++ : CorrectionTP C++ : Correction
TP C++ : Correction
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
Merise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigésMerise+ +exercices+mcd+-+corrigés
Merise+ +exercices+mcd+-+corrigés
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
exercices Corrigées du merise
exercices Corrigées du  meriseexercices Corrigées du  merise
exercices Corrigées du merise
 
Correction de td poo n2
Correction de td poo n2Correction de td poo n2
Correction de td poo n2
 
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
 
Exercice java vehicule
Exercice java vehiculeExercice java vehicule
Exercice java vehicule
 
02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo202 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
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++
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
résumé POO java .pdf
résumé POO java .pdfrésumé POO java .pdf
résumé POO java .pdf
 
Poo en c++ les relations entre classes
Poo en c++ les relations entre classesPoo en c++ les relations entre classes
Poo en c++ les relations entre classes
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Récursivité
RécursivitéRécursivité
Récursivité
 

En vedette

Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Fabio Hernandez
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Fabio Hernandez
 
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Fabio Hernandez
 
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Fabio Hernandez
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Fabio Hernandez
 
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Fabio Hernandez
 
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++Partie 6: Qualité du Logiciel — Programmation orientée objet en C++
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++Fabio Hernandez
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Fabio Hernandez
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Fabio Hernandez
 

En vedette (10)

Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++
 
Introduction à C++
Introduction à C++Introduction à C++
Introduction à C++
 
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
 
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
Partie 5: Mémoire Dynamique — Programmation orientée objet en C++
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
 
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
 
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++Partie 6: Qualité du Logiciel — Programmation orientée objet en C++
Partie 6: Qualité du Logiciel — Programmation orientée objet en C++
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++
 

Similaire à Partie 9: Fonctions Membres — Programmation orientée objet en C++

Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
PowerShell - Retours d'expériences
PowerShell - Retours d'expériencesPowerShell - Retours d'expériences
PowerShell - Retours d'expériencesRan Mellul
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Gregory Renard
 
Drupal i18n & Features
Drupal i18n & FeaturesDrupal i18n & Features
Drupal i18n & Featuresbasillic
 
projet_prog5.pptx
projet_prog5.pptxprojet_prog5.pptx
projet_prog5.pptxayoubdj19
 
0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdfRihabBENLAMINE
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Chapitre 9 - Les fonctions.pdf
Chapitre 9 - Les fonctions.pdfChapitre 9 - Les fonctions.pdf
Chapitre 9 - Les fonctions.pdfShiniGami0o0
 
Développement de plug in sous eclipse
Développement de plug in sous eclipseDéveloppement de plug in sous eclipse
Développement de plug in sous eclipseISIG
 
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023ChristopheVidal15
 
Drupal : Profils d'Installation
Drupal : Profils d'InstallationDrupal : Profils d'Installation
Drupal : Profils d'Installationbricef
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieLoic Yon
 

Similaire à Partie 9: Fonctions Membres — Programmation orientée objet en C++ (20)

Org mode pour LaTeXiens
Org mode pour LaTeXiensOrg mode pour LaTeXiens
Org mode pour LaTeXiens
 
POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
PowerShell - Retours d'expériences
PowerShell - Retours d'expériencesPowerShell - Retours d'expériences
PowerShell - Retours d'expériences
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Ch04
Ch04Ch04
Ch04
 
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
Visual Basic 9.0 – Visual Studio 2008 Quoi De Neuf 2.0
 
Drupal i18n & Features
Drupal i18n & FeaturesDrupal i18n & Features
Drupal i18n & Features
 
projet_prog5.pptx
projet_prog5.pptxprojet_prog5.pptx
projet_prog5.pptx
 
0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf
 
POO-chapitre2.pptx
POO-chapitre2.pptxPOO-chapitre2.pptx
POO-chapitre2.pptx
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Chapitre 9 - Les fonctions.pdf
Chapitre 9 - Les fonctions.pdfChapitre 9 - Les fonctions.pdf
Chapitre 9 - Les fonctions.pdf
 
Développement de plug in sous eclipse
Développement de plug in sous eclipseDéveloppement de plug in sous eclipse
Développement de plug in sous eclipse
 
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023
Les nouveautés de PrestaShop 9 par la team PrestaShop - FoP Day 2023
 
Drupal : Profils d'Installation
Drupal : Profils d'InstallationDrupal : Profils d'Installation
Drupal : Profils d'Installation
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Langage C
Langage CLangage C
Langage C
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partie
 

Partie 9: Fonctions Membres — Programmation orientée objet en C++

  • 1. Programmation Orientée Objet en C++ 9ème Partie: Fonctions Membres Fabio Hernandez Fabio.Hernandez@in2p3.fr
  • 2. Vue d'Ensemble Notions de base Types, variables, opérateurs Contrôle d'exécution Fonctions Mémoire dynamique Qualité du logiciel Evolution du modèle objet Objets et classes Fonctions membres Classes génériques Héritage Polymorphisme Héritage multiple Entrée/sortie POO en C++: Fonctions Membres 257 © 1997-2003 Fabio HERNANDEZ
  • 3. Table des Matières Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 258 © 1997-2003 Fabio HERNANDEZ
  • 4. Fonctions membres inline On peut classer les fonctions membres par rapport à leur mission vis-à-vis de la classe gestion (construction, destruction, copie, ...) modification de l'état consultation de l'état (attributs) de l'objet fonctions d'aide itération, pour les classes d'objets qui sont des conteneurs d'autres objets opérateurs (affectation, comparaison, ...) L ’objectif de quelques-unes d ’entre elles est de permettre la consultation des attributs, tout en gardant l ’encapsulation le corps de la fonction membre est petit POO en C++: Fonctions Membres 259 © 1997-2003 Fabio HERNANDEZ
  • 5. Fonctions membres inline C++ fournit un mécanisme pour que l ’exécution de ces fonctions membres ne soit pas pénalisante en termes de performance Le mot clé inline suggère au compilateur de remplacer l ’appel par le corps même de la fonction Exemple la classe Point définie précédemment fournit deux fonctions membres pour accéder aux attributs (coordonnées cartésiennes) d ’un objet de la classe ce sont des candidates à être des fonctions inline POO en C++: Fonctions Membres 260 © 1997-2003 Fabio HERNANDEZ
  • 6. Fonctions membres inline (suite) class Point { public: // Constructors ... // Modifiers ... // Selectors float getX() const; float getY() const; ... private: // Data members float x_; float y_; }; POO en C++: Fonctions Membres 261 © 1997-2003 Fabio HERNANDEZ
  • 7. Fonctions membres inline (suite) Nous avions défini les fonctions membres x() et y() dans le fichier Point.cpp comme suit float Point::getX() const { return x_; } float Point::getY() const { return y_; } Pour que le compilateur puisse optimiser l ’appel à ces fonctions membres nous devons ajouter le mot clé inline à la définition de la fonction mettre l'implémentation de la fonction dans le fichier Point.h POO en C++: Fonctions Membres 262 © 1997-2003 Fabio HERNANDEZ
  • 8. Fonctions membres inline (suite) En plus de l ’interface de la classe, le fichier Point.h contiendra la définition de toutes les fonctions membres de type inline inline float Point::getX() const Le mot clé inline { est rajouté à la return x_; définition de la } fonction membre inline float Point::getY() const { return y_; } POO en C++: Fonctions Membres 263 © 1997-2003 Fabio HERNANDEZ
  • 9. Fonctions membres inline (suite) Lors de l ’utilisation d ’une de ces fonctions membres Point p(18.0, 70.0); float offset = p.getX(); le compilateur "remplace" l ’appel à la fonction membre Point::x() par le corps de la fonction, comme si nous avions écrit float offset = p.x_; Avantages amélioration des performances préservation de l ’encapsulation Inconvénients le fichier .h de la classe peut devenir gros, ce qui ralentit la compilation peut poser des problèmes à certains déboguers POO en C++: Fonctions Membres 264 © 1997-2003 Fabio HERNANDEZ
  • 10. Fonctions membres inline (suite) Autre façon consiste à définir le corps de la fonction membre dans la déclaration de l ’interface de la classe class Point { public: ... // Selectors float getX() const {return x_;}; // Not recommended float getY() const {return y_;}; ... private: ... }; Gros inconvénient: pollution de l ’interface POO en C++: Fonctions Membres 265 © 1997-2003 Fabio HERNANDEZ
  • 11. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 266 © 1997-2003 Fabio HERNANDEZ
  • 12. Arguments par défaut C++ permet de définir la valeur par défaut des arguments des fonctions (membres et non membres) Si l ’on appelle la fonction sans ou avec une liste partielle d ’arguments, le compilateur rajoutera les arguments qui manquent avec les valeurs qui ont été spécifiées par défaut Exemple: on modifie l ’interface de la classe Point comme class Point { public: ... // Modifiers void translate(float horizontal = 1.0, Arguments float vertical = 1.0); par défaut ... }; POO en C++: Fonctions Membres 267 © 1997-2003 Fabio HERNANDEZ
  • 13. Arguments par défaut (suite) Nous pouvons maintenant utiliser cette fonction membre comme Point p(10.8, 30.4); p.translate(); // p.translate(1.0, 1.0); p.translate(5.0); // p.translate(5.0, 1.0); p.translate(6.9, 7.0); La possibilité de spécifier des arguments par défaut est utile pour fournir une façon abrégée d ’utiliser une fonction membre avec les arguments les plus souvent utilisés attributs de création d’une fenêtre chaîne nulle valeurs booléens … POO en C++: Fonctions Membres 268 © 1997-2003 Fabio HERNANDEZ
  • 14. Arguments par défaut (suite) Inconvénient: le texte du programme peut devenir confus il est plus claire si on lit p.translate(1.0, 1.0); que p.translate(); même si le résultat en exécution est identique POO en C++: Fonctions Membres 269 © 1997-2003 Fabio HERNANDEZ
  • 15. Arguments par défaut (suite) Les constructeurs peuvent aussi avoir des arguments par défaut class Point { public: // Constructors/Destructor Point(float initialX = 0.0 , float initialY = 0.0 ); Point(const Point& aPoint); ~Point(); ... }; POO en C++: Fonctions Membres 270 © 1997-2003 Fabio HERNANDEZ
  • 16. Arguments par défaut (suite) Ceci offre la possibilité de construire un objet de cette classe de plusieurs façons différentes, toutes faisant appel au même constructeur Point origin; // Point::Point(0.0, 0.0) Point unit(1.0); // Point::Point(1.0, 0.0) Point start(15.9, 45.3); Notez que l ’implémentation de la classe (fichier .cpp) n ’est pas modifiée: uniquement son interface (fichier .h) POO en C++: Fonctions Membres 271 © 1997-2003 Fabio HERNANDEZ
  • 17. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 272 © 1997-2003 Fabio HERNANDEZ
  • 18. Le pointeur this Dans certains cas, il est nécessaire dans le corps d'une fonction membre de faire référence explicite à l'objet sur lequel la fonction membre s'applique Toutes les fonctions membres en C++ ont accès à un pointeur à l'objet via le mot clé this Exemple: on peut écrire la fonction membre translate de la classe Point comme void Point::translate(float horizontal, float vertical) { this->x_ += horizontal; this->y_ += vertical; }; POO en C++: Fonctions Membres 273 © 1997-2003 Fabio HERNANDEZ
  • 19. Le pointeur this (suite) this est un pointeur à un objet de la classe Point qui ne peut pas être modifié void Point::translate(float horizontal, float vertical) { this = 0; // COMPILATION ERROR: "this" is constant } Ceci est vrai pour n'importe quelle classe this existe uniquement dans le contexte d'une fonction membre A quoi sert-il? Un exemple de son utilité dans le chapitre suivant POO en C++: Fonctions Membres 274 © 1997-2003 Fabio HERNANDEZ
  • 20. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 275 © 1997-2003 Fabio HERNANDEZ
  • 21. Surcharge des opérateurs Avec les outils du langage étudiés jusqu'à présent nous pouvons définir des nouvelles classes, créer des objets de ces classes et les manipuler presque comme les objets des types primitifs Néanmoins, avec des objets des types primitifs int count; int threshold; nous pouvons écrire if (count == threshold) { ... } if (count < 10000) { ... } POO en C++: Fonctions Membres 276 © 1997-2003 Fabio HERNANDEZ
  • 22. Surcharge des opérateurs (suite) Autrement dit, on peut utiliser les opérateurs arithmétiques et logiques qui sont prédéfinis par le langage C++ offre au programmeur la possibilité de définir la plupart d'opérateurs pour une classe quelconque Exemple: pour comparer deux objets de la classe Point nous avons défini la fonction membre bool Point::isEqualTo(const Point& aPoint) const { return (x_ == aPoint.x_) && (y_ == aPoint.y_); } POO en C++: Fonctions Membres 277 © 1997-2003 Fabio HERNANDEZ
  • 23. Surcharge des opérateurs (suite) Ceci nous permet de comparer deux objets de la classe Point comme Point origin; Point target(15.0, 18.0); ... if ( target.isEqualTo(origin) ) { // do something when they are equal } Il est souhaitable de pouvoir comparer ces deux objets de la même façon que l'on compare deux objets d'un type primitif if (target == origin) { // do something when they are equal } POO en C++: Fonctions Membres 278 © 1997-2003 Fabio HERNANDEZ
  • 24. Surcharge des opérateurs (suite) Nous allons donc redéfinir l'opérateur d'égalité "==" pour les objets de la classe Point Tout d'abord, il faut modifier l'interface de la classe class Point { public: // Constructors/Destructor ... // Operators bool operator==(const Point& aPoint) const; ... private: ... }; POO en C++: Fonctions Membres 279 © 1997-2003 Fabio HERNANDEZ
  • 25. Surcharge des opérateurs (suite) Ensuite, il faut écrire l'implémentation de cette nouvelle fonction membre bool Point::operator==(const Point& aPoint) const { return (x_ == aPoint.x_) && (y_ == aPoint.y_); } Nous pouvons maintenant utiliser cet opérateur Point origin; Point target(15.0, 18.0); ... if (target == origin) { // do something when they are equal } POO en C++: Fonctions Membres 280 © 1997-2003 Fabio HERNANDEZ
  • 26. Surcharge des opérateurs (suite) Ceci est équivalent à if ( target.operator==(origin) ) { // do something when they are equal } l'opérateur de comparaison s'applique à l'objet target avec comme argument l'objet origin Notez la différence avec if (origin == target) { ... } qui est équivalent à if ( origin.operator==(target) ) { ... } POO en C++: Fonctions Membres 281 © 1997-2003 Fabio HERNANDEZ
  • 27. Surcharge des opérateurs (suite) Surcharge de l'opérateur d'inégalité class Point { public: // Constructors/Destructor ... // Operators bool operator==(const Point& aPoint) const; bool operator!=(const Point& aPoint) const; ... private: ... }; POO en C++: Fonctions Membres 282 © 1997-2003 Fabio HERNANDEZ
  • 28. Surcharge des opérateurs (suite) Pour l'implémentation on peut utiliser l'opérateur de comparaison déjà défini inline bool Point::operator!=(const Point& aPoint) const { return (*this == aPoint) ? false : true; } Il est désormais possible d'écrire Point origin; Point target(15.0, 18.0); ... if (target != origin) { // do something when they are different } POO en C++: Fonctions Membres 283 © 1997-2003 Fabio HERNANDEZ
  • 29. Surcharge des opérateurs (suite) Limitations uniquement un ensemble prédéfini d'opérateurs peuvent être surchargés impossible d'introduire de nouveaux opérateurs (** par exemple) la signification prédéfinie des opérateurs des types primitifs ne peut pas être modifiée la précédence des opérations n'est pas modifiée, indépendamment du type (classe) des opérandes Avantages traitement uniforme des objets appartenant aux classes définies par le programmeur et des objets des types primitifs lisibilité du code Inconvénient peut se prêter à confusion si utilisé sans discrimination POO en C++: Fonctions Membres 284 © 1997-2003 Fabio HERNANDEZ
  • 30. Surcharge des opérateurs (suite) Quels sont les opérateurs qui peuvent être surchargés? + ! << %= -> - , >> ^= ->* * = == &= new / < != |= delete % > && *= ^ <= || << & >= += >> | ++ -= [] ~ -- /= () POO en C++: Fonctions Membres 285 © 1997-2003 Fabio HERNANDEZ
  • 31. Surcharge des opérateurs (suite) Surcharge de l'opérateur d'affectation class Point { public: // Constructors/Destructor ... // Operators bool operator==(const Point& aPoint) const; bool operator!=(const Point& aPoint) const; Point& operator=(const Point& aPoint); ... private: ... }; POO en C++: Fonctions Membres 286 © 1997-2003 Fabio HERNANDEZ
  • 32. Surcharge des opérateurs (suite) Surcharge de l'opérateur d'affectation (suite) Point& Point::operator=(const Point& aPoint) { if (this == &aPoint) return *this; Affectation de x_ = aPoint.x_; tous les attributs à y_ = aPoint.y_; partir de return *this; l'argument } POO en C++: Fonctions Membres 287 © 1997-2003 Fabio HERNANDEZ
  • 33. Surcharge des opérateurs (suite) Si l'on veut affecter un objet de la classe Point on peut désormais écrire Point origin; Point target(13.0, 15.0); ... target = origin; // target.operator=(origin); Surcharge de l'opérateur de sortie avec des variables des types primitifs nous pouvons écrire int count = 150; ... cout << "count = " << count << endl; nous voulons pouvoir faire pareil pour les objets de la classe Point cout << "target = " << target << endl; POO en C++: Fonctions Membres 288 © 1997-2003 Fabio HERNANDEZ
  • 34. Surcharge des opérateurs (suite) Surcharge de l'opérateur de sortie (suite) et que sur l'écran apparaîsse target = [13.0, 15.0] Ceci est possible si l'on surcharge l'opérateur de sortie << Cet opérateur ne peut pas être une fonction membre de la classe Point il a besoin d'un objet de la classe ostream (dans l'exemple cout) comme premier argument équivalent à cout.operator<<(target) toute fonction membre de la classe Point est appliqué sur un objet de cette classe POO en C++: Fonctions Membres 289 © 1997-2003 Fabio HERNANDEZ
  • 35. Surcharge des opérateurs (suite) On peut donc définir cet opérateur comme une fonction non- membre associée à la classe Point et implémentée dans le fichier Point.cpp #include <iostream> ostream& operator<<(ostream& stream, const Point& aPoint) { stream << '[‘ << aPoint.getX() << ',' << aPoint.getY() << ']'; return stream; } POO en C++: Fonctions Membres 290 © 1997-2003 Fabio HERNANDEZ
  • 36. Surcharge des opérateurs (suite) Le fichier Point.h contiendra, en plus de l'interface de la classe, la déclaration du prototype de la fonction non-membre #include <iostream> class Point { public: ... private: ... }; extern ostream& operator<<(ostream& stream, const Point& aPoint); POO en C++: Fonctions Membres 291 © 1997-2003 Fabio HERNANDEZ
  • 37. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 292 © 1997-2003 Fabio HERNANDEZ
  • 38. Fonctions amies La fonction non-membre opérateur << a besoin des valeurs des coordonnées x et y d'un objet Point Elle utilise les fonctions membres fournies par la classe pour accéder aux attributs de l'objet (Point::getX() et Point::getY()) Si l'opérateur avait accès directe aux attributs x_ et y_ de l'objet il n'aurait pas besoin d'appeler les fonctions membres Mais les attributs sont privés, donc inaccessibles pour une fonction non-membre de la classe En C++ on peut définir des fonctions (ou des classes) amies d'une classe POO en C++: Fonctions Membres 293 © 1997-2003 Fabio HERNANDEZ
  • 39. Fonctions amies (suite) Une fonction (ou objet d'une classe) amie a accès à tous les attributs de l'objet, indépendamment du contrôle d'accès défini par la classe Les fonctions (ou classes) amies sont déclarées comme telles dans l'interface de la classe POO en C++: Fonctions Membres 294 © 1997-2003 Fabio HERNANDEZ
  • 40. Fonctions amies (suite) #include <iostream> class Point { public: // Constructors/Destructor ... // Operators friend ostream& operator<<(ostream& stream, const Point& aPoint); // Modifiers ... // Selectors ... private: ... }; POO en C++: Fonctions Membres 295 © 1997-2003 Fabio HERNANDEZ
  • 41. Fonctions amies (suite) On peut donc reécrire l'opérateur de sortie dans le fichier Point.cpp #include "Point.h" ostream& operator<<(ostream& stream, const Point& aPoint) { stream << '[‘ << aPoint.x_ << ',' << aPoint.y_ << ']'; return stream; } POO en C++: Fonctions Membres 296 © 1997-2003 Fabio HERNANDEZ
  • 42. Fonctions amies (suite) Avantages moyen de contourner les mécanismes de contrôle d'accès utile dans les cas où il est nécessaire, pour des raisons de performance d'accéder, aux attributs privés d'un objet sans danger Inconvénients moyen de contourner les mécanismes de contrôle d'accès fort couplage entre les classes (fonctions) amies modifications peuvent être difficiles POO en C++: Fonctions Membres 297 © 1997-2003 Fabio HERNANDEZ
  • 43. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 298 © 1997-2003 Fabio HERNANDEZ
  • 44. Données membres statiques Il est parfois nécessaire de partager une même valeur par tous les objets d'une classe une condition un compteur associé à la classe qui est modifié au fur et à mesure que l'exécution du programme se poursuit une valeur constante Il est plus efficace d'avoir une seule variable ou constante pour tous les objets de la classe au lieu d'une par chaque instance (objet) Une donnée membre statique peut être vue comme une variable globale à la classe à laquelle elle appartient POO en C++: Fonctions Membres 299 © 1997-2003 Fabio HERNANDEZ
  • 45. Données membres statiques (suite) Exemple: supposons qu'il est nécessaire de connaître le nombre d'objets de la classe Point actifs à un moment donné nous avons besoin d'un compteur au niveau de la classe Point ceci est modélisé comme une donnée membre statique class Point { public: ... private: float x_; float y_; static int instanceCounter_; }; POO en C++: Fonctions Membres 300 © 1997-2003 Fabio HERNANDEZ
  • 46. Données membres statiques (suite) L'implémentation des constructeurs et du destructeur sont modifiées Point::Point() { x_ = 0.0; y_ = 0.0; ++instanceCounter_; } // similarly for the other constructors Point::~Point() { --instanceCounter_; } POO en C++: Fonctions Membres 301 © 1997-2003 Fabio HERNANDEZ
  • 47. Données membres statiques (suite) Il est nécessaire aussi de donner une valeur initiale à cette donnée membre dans le fichier Point.cpp int Point::instanceCounter_ = 0; On pourrait ajouter une fonction membre pour accéder au compteur d'instances inline int Point::numberOfInstances() const { return instanceCounter_; } POO en C++: Fonctions Membres 302 © 1997-2003 Fabio HERNANDEZ
  • 48. Données membres statiques (suite) Notez que l'accès à une donnée membre statique est le même que pour les autres attributs de l'objet Les mécanismes de contrôle d'accès sont aussi respectés Quel est le résultat de l'exécution du code ci-dessous? Point p(15.0, 45.0); cout << "Number of instances: " << p.numberOfInstances() << endl; Point q; cout << "Number of instances: " << q.numberOfInstances() << endl; POO en C++: Fonctions Membres 303 © 1997-2003 Fabio HERNANDEZ
  • 49. Données membres statiques (suite) Une autre utilisation des données membres statiques est la définition de constantes Nous pourrions définir un ensemble de constantes physiques et/ou mathématiques dans une classe class PhysicalConstants { public: static const double LightSpeed; static const double Gravitational; static const double Boltzmann; ... }; POO en C++: Fonctions Membres 304 © 1997-2003 Fabio HERNANDEZ
  • 50. Données membres statiques (suite) Définition de constantes à l'intérieur d'une classe (suite) class MathConstants { public: static const double Pi; ... }; POO en C++: Fonctions Membres 305 © 1997-2003 Fabio HERNANDEZ
  • 51. Données membres statiques (suite) Il faut leur donner les valeurs initiales correspondantes (fichier PhysicalConstants.cpp et MathConstants.cpp) const double PhysicalConstants::LightSpeed=3.00e8; const double PhysicalConstants::Gravitational=6.67e-11; const double PhysicalConstants::Boltzmann=1.38e-23; const double MathConstants::Pi=3.1415926535; POO en C++: Fonctions Membres 306 © 1997-2003 Fabio HERNANDEZ
  • 52. Données membres statiques (suite) Et pour utiliser ces constantes #include "MathConstants.h" float Point::theta() { if (x_ == 0.0) { // WARNING: not very safe if (y_ == 0.0) return 0.0; const float Pi = MathConstants::Pi; return (y_ > 0.0) ? 0.5*Pi : 1.5*Pi; } return atan(y_/x_); } POO en C++: Fonctions Membres 307 © 1997-2003 Fabio HERNANDEZ
  • 53. Contrôle d'Avancement Fonctions membres inline Arguments par défaut Le pointeur this Surcharge des opérateurs Fonctions amies Données membres statiques Fonctions membres statiques Résumé POO en C++: Fonctions Membres 308 © 1997-2003 Fabio HERNANDEZ
  • 54. Fonctions membres statiques (suite) Intuitivement, la fonction membre pour obtenir le nombre d'instances de la classe Point devrait être attachée à la classe elle même et non à une instance particulière De la même façon que l'on définit des données membres (constantes ou pas), on peut définir des fonctions membres statiques Une fonction de ce type est associée à la classe et non pas à une instance pas de référence implicite ou explicite au pointeur this l'appel à une de ces fonctions suppose une syntaxe particulière POO en C++: Fonctions Membres 309 © 1997-2003 Fabio HERNANDEZ
  • 55. Fonctions membres statiques (suite) class Point { public: //Constructors/Destructor ... // Selectors static int numberOfInstances(); ... // Modifiers ... private: float x_; float y_; static int instanceCounter_; }; POO en C++: Fonctions Membres 310 © 1997-2003 Fabio HERNANDEZ
  • 56. Fonctions membres statiques (suite) La définition de la fonction est identique que dans le cas non statique sauf pour le const inline int Point::numberOfInstances() { return instanceCounter_; } L'utilisation varie Point p(15.0, 45.0); cout << "Number of instances: " << Point::numberOfInstances() << endl; POO en C++: Fonctions Membres 311 © 1997-2003 Fabio HERNANDEZ
  • 57. Résumé Les fonctions inline permettent de remplacer les appels aux fonctions membres tout en conservant l'encapsulation On peut spécifier des arguments par défaut pour des fonctions (membres et non-membres) Les fonctions membres d'une classe ont accès à l'objet sur lequel elles s'appliquent via le pointeur this Les opérateurs arithmétiques et logiques peuvent être redéfinis pour chaque classe créée par le programmeur Les fonctions et classes amies offrent un moyen de contourner le contrôle d'accès Des données et fonctions globales à une classe peuvent être définies POO en C++: Fonctions Membres 312 © 1997-2003 Fabio HERNANDEZ