Your SlideShare is downloading. ×
0
Programmation Orientée Objet en C++      9ème Partie: Fonctions Membres              Fabio Hernandez            Fabio.Hern...
Vue dEnsemble   Notions de base   Types, variables, opérateurs   Contrôle dexécution   Fonctions   Mémoire dynamique   Qua...
Table des Matières   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fonct...
Fonctions membres inline   On peut classer les fonctions membres par rapport à leur   mission vis-à-vis de la classe      ...
Fonctions membres inline   C++ fournit un mécanisme pour que l ’exécution de ces fonctions   membres ne soit pas pénalisan...
Fonctions membres inline (suite)          class Point {          public:             // Constructors             ...      ...
Fonctions membres inline (suite)   Nous avions défini les fonctions membres x() et y() dans le   fichier Point.cpp comme s...
Fonctions membres inline (suite)   En plus de l ’interface de la classe, le fichier Point.h   contiendra la définition de ...
Fonctions membres inline (suite)   Lors de l ’utilisation d ’une de ces fonctions membres          Point p(18.0, 70.0);   ...
Fonctions membres inline (suite)   Autre façon consiste à définir le corps de la fonction membre   dans la déclaration de ...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Arguments par défaut   C++ permet de définir la valeur par défaut des arguments des   fonctions (membres et non membres)  ...
Arguments par défaut (suite)   Nous pouvons maintenant utiliser cette fonction membre comme           Point p(10.8, 30.4);...
Arguments par défaut (suite)   Inconvénient: le texte du programme peut devenir confus         il est plus claire si on li...
Arguments par défaut (suite)   Les constructeurs peuvent aussi avoir des arguments par défaut          class Point {      ...
Arguments par défaut (suite)   Ceci offre la possibilité de construire un objet de cette classe   de plusieurs façons diff...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Le pointeur this   Dans certains cas, il est nécessaire dans le corps dune fonction   membre de faire référence explicite ...
Le pointeur this (suite)   this est un pointeur à un objet de la classe Point qui ne peut   pas être modifié          void...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Surcharge des opérateurs   Avec les outils du langage étudiés jusquà présent nous pouvons   définir des nouvelles classes,...
Surcharge des opérateurs (suite)   Autrement dit, on peut utiliser les opérateurs arithmétiques et   logiques qui sont pré...
Surcharge des opérateurs (suite)   Ceci nous permet de comparer deux objets de la classe Point   comme          Point orig...
Surcharge des opérateurs (suite)   Nous allons donc redéfinir lopérateur dégalité "==" pour les   objets de la classe Poin...
Surcharge des opérateurs (suite)   Ensuite, il faut écrire limplémentation de cette nouvelle   fonction membre          bo...
Surcharge des opérateurs (suite)   Ceci est équivalent à          if ( target.operator==(origin) ) {              // do so...
Surcharge des opérateurs (suite)   Surcharge de lopérateur dinégalité          class Point {          public:             ...
Surcharge des opérateurs (suite)   Pour limplémentation on peut utiliser lopérateur de   comparaison déjà défini          ...
Surcharge des opérateurs (suite)   Limitations         uniquement un ensemble prédéfini dopérateurs peuvent être surchargé...
Surcharge des opérateurs (suite)   Quels sont les opérateurs qui peuvent être surchargés?         +               !      <...
Surcharge des opérateurs (suite)   Surcharge de lopérateur daffectation          class Point {          public:           ...
Surcharge des opérateurs (suite)   Surcharge de lopérateur daffectation (suite)          Point& Point::operator=(const Poi...
Surcharge des opérateurs (suite)   Si lon veut affecter un objet de la classe Point on peut   désormais écrire          Po...
Surcharge des opérateurs (suite)   Surcharge de lopérateur de sortie (suite)         et que sur lécran apparaîsse         ...
Surcharge des opérateurs (suite)   On peut donc définir cet opérateur comme une fonction non-   membre associée à la class...
Surcharge des opérateurs (suite)   Le fichier Point.h contiendra, en plus de linterface de la   classe, la déclaration du ...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Fonctions amies   La fonction non-membre opérateur << a besoin des valeurs des   coordonnées x et y dun objet Point   Elle...
Fonctions amies (suite)   Une fonction (ou objet dune classe) amie a accès à tous les   attributs de lobjet, indépendammen...
Fonctions amies (suite)          #include <iostream>          class Point {          public:              // Constructors/...
Fonctions amies (suite)   On peut donc reécrire lopérateur de sortie dans le fichier   Point.cpp          #include "Point....
Fonctions amies (suite)   Avantages         moyen de contourner les mécanismes de contrôle daccès         utile dans les c...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Données membres statiques   Il est parfois nécessaire de partager une même valeur par tous   les objets dune classe       ...
Données membres statiques (suite)   Exemple: supposons quil est nécessaire de connaître le nombre   dobjets de la classe P...
Données membres statiques (suite)   Limplémentation des constructeurs et du destructeur sont   modifiées          Point::P...
Données membres statiques (suite)   Il est nécessaire aussi de donner une valeur initiale à cette   donnée membre         ...
Données membres statiques (suite)   Notez que laccès à une donnée membre statique est le même   que pour les autres attrib...
Données membres statiques (suite)   Une autre utilisation des données membres statiques est la   définition de constantes ...
Données membres statiques (suite)   Définition de constantes à lintérieur dune classe (suite)          class MathConstants...
Données membres statiques (suite)   Il faut leur donner les valeurs initiales correspondantes (fichier   PhysicalConstants...
Données membres statiques (suite)   Et pour utiliser ces constantes          #include "MathConstants.h"          float Poi...
Contrôle dAvancement   Fonctions membres inline   Arguments par défaut   Le pointeur this   Surcharge des opérateurs   Fon...
Fonctions membres statiques (suite)   Intuitivement, la fonction membre pour obtenir le nombre   dinstances de la classe P...
Fonctions membres statiques (suite)          class Point {          public:             //Constructors/Destructor         ...
Fonctions membres statiques (suite)   La définition de la fonction est identique que dans le cas non   statique sauf pour ...
Résumé   Les fonctions inline permettent de remplacer les appels aux   fonctions membres tout en conservant lencapsulation...
Upcoming SlideShare
Loading in...5
×

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

1,463

Published on

Support material for a continued education course "Introduction to object oriented programming in C++".
In French.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,463
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
128
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Programmation Orientée Objet en C++ 9ème Partie: Fonctions Membres Fabio Hernandez Fabio.Hernandez@in2p3.fr
  2. 2. Vue dEnsemble Notions de base Types, variables, opérateurs Contrôle dexé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/sortiePOO en C++: Fonctions Membres 257 © 1997-2003 Fabio HERNANDEZ
  3. 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. 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 lobjet fonctions daide itération, pour les classes dobjets qui sont des conteneurs dautres 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 petitPOO en C++: Fonctions Membres 259 © 1997-2003 Fabio HERNANDEZ
  5. 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 inlinePOO en C++: Fonctions Membres 260 © 1997-2003 Fabio HERNANDEZ
  6. 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. 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 limplémentation de la fonction dans le fichier Point.hPOO en C++: Fonctions Membres 262 © 1997-2003 Fabio HERNANDEZ
  8. 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. 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éboguersPOO en C++: Fonctions Membres 264 © 1997-2003 Fabio HERNANDEZ
  10. 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 ’interfacePOO en C++: Fonctions Membres 265 © 1997-2003 Fabio HERNANDEZ
  11. 11. Contrôle dAvancement 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. 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. 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. 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 identiquePOO en C++: Fonctions Membres 269 © 1997-2003 Fabio HERNANDEZ
  15. 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. 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. 17. Contrôle dAvancement 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. 18. Le pointeur this Dans certains cas, il est nécessaire dans le corps dune fonction membre de faire référence explicite à lobjet sur lequel la fonction membre sapplique Toutes les fonctions membres en C++ ont accès à un pointeur à lobjet 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. 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 nimporte quelle classe this existe uniquement dans le contexte dune fonction membre A quoi sert-il? Un exemple de son utilité dans le chapitre suivantPOO en C++: Fonctions Membres 274 © 1997-2003 Fabio HERNANDEZ
  20. 20. Contrôle dAvancement 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. 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. 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 dopé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. 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 lon compare deux objets dun type primitif if (target == origin) { // do something when they are equal }POO en C++: Fonctions Membres 278 © 1997-2003 Fabio HERNANDEZ
  24. 24. Surcharge des opérateurs (suite) Nous allons donc redéfinir lopérateur dégalité "==" pour les objets de la classe Point Tout dabord, il faut modifier linterface 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. 25. Surcharge des opérateurs (suite) Ensuite, il faut écrire limplé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. 26. Surcharge des opérateurs (suite) Ceci est équivalent à if ( target.operator==(origin) ) { // do something when they are equal } lopérateur de comparaison sapplique à lobjet target avec comme argument lobjet 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. 27. Surcharge des opérateurs (suite) Surcharge de lopérateur diné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. 28. Surcharge des opérateurs (suite) Pour limplémentation on peut utiliser lopé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. 29. Surcharge des opérateurs (suite) Limitations uniquement un ensemble prédéfini dopérateurs peuvent être surchargés impossible dintroduire 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 nest 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 discriminationPOO en C++: Fonctions Membres 284 © 1997-2003 Fabio HERNANDEZ
  30. 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. 31. Surcharge des opérateurs (suite) Surcharge de lopérateur daffectation 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. 32. Surcharge des opérateurs (suite) Surcharge de lopérateur daffectation (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; largument }POO en C++: Fonctions Membres 287 © 1997-2003 Fabio HERNANDEZ
  33. 33. Surcharge des opérateurs (suite) Si lon 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 lopé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. 34. Surcharge des opérateurs (suite) Surcharge de lopérateur de sortie (suite) et que sur lécran apparaîsse target = [13.0, 15.0] Ceci est possible si lon surcharge lopérateur de sortie << Cet opérateur ne peut pas être une fonction membre de la classe Point il a besoin dun objet de la classe ostream (dans lexemple cout) comme premier argument équivalent à cout.operator<<(target) toute fonction membre de la classe Point est appliqué sur un objet de cette classePOO en C++: Fonctions Membres 289 © 1997-2003 Fabio HERNANDEZ
  35. 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. 36. Surcharge des opérateurs (suite) Le fichier Point.h contiendra, en plus de linterface 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. 37. Contrôle dAvancement 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. 38. Fonctions amies La fonction non-membre opérateur << a besoin des valeurs des coordonnées x et y dun objet Point Elle utilise les fonctions membres fournies par la classe pour accéder aux attributs de lobjet (Point::getX() et Point::getY()) Si lopérateur avait accès directe aux attributs x_ et y_ de lobjet il naurait pas besoin dappeler 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 dune classePOO en C++: Fonctions Membres 293 © 1997-2003 Fabio HERNANDEZ
  39. 39. Fonctions amies (suite) Une fonction (ou objet dune classe) amie a accès à tous les attributs de lobjet, indépendamment du contrôle daccès défini par la classe Les fonctions (ou classes) amies sont déclarées comme telles dans linterface de la classePOO en C++: Fonctions Membres 294 © 1997-2003 Fabio HERNANDEZ
  40. 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. 41. Fonctions amies (suite) On peut donc reécrire lopé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. 42. Fonctions amies (suite) Avantages moyen de contourner les mécanismes de contrôle daccès utile dans les cas où il est nécessaire, pour des raisons de performance daccéder, aux attributs privés dun objet sans danger Inconvénients moyen de contourner les mécanismes de contrôle daccès fort couplage entre les classes (fonctions) amies modifications peuvent être difficilesPOO en C++: Fonctions Membres 297 © 1997-2003 Fabio HERNANDEZ
  43. 43. Contrôle dAvancement 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. 44. Données membres statiques Il est parfois nécessaire de partager une même valeur par tous les objets dune classe une condition un compteur associé à la classe qui est modifié au fur et à mesure que lexécution du programme se poursuit une valeur constante Il est plus efficace davoir une seule variable ou constante pour tous les objets de la classe au lieu dune par chaque instance (objet) Une donnée membre statique peut être vue comme une variable globale à la classe à laquelle elle appartientPOO en C++: Fonctions Membres 299 © 1997-2003 Fabio HERNANDEZ
  45. 45. Données membres statiques (suite) Exemple: supposons quil est nécessaire de connaître le nombre dobjets de la classe Point actifs à un moment donné nous avons besoin dun 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. 46. Données membres statiques (suite) Limplé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. 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 dinstances inline int Point::numberOfInstances() const { return instanceCounter_; }POO en C++: Fonctions Membres 302 © 1997-2003 Fabio HERNANDEZ
  48. 48. Données membres statiques (suite) Notez que laccès à une donnée membre statique est le même que pour les autres attributs de lobjet Les mécanismes de contrôle daccès sont aussi respectés Quel est le résultat de lexé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. 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. 50. Données membres statiques (suite) Définition de constantes à lintérieur dune classe (suite) class MathConstants { public: static const double Pi; ... };POO en C++: Fonctions Membres 305 © 1997-2003 Fabio HERNANDEZ
  51. 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. 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. 53. Contrôle dAvancement 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. 54. Fonctions membres statiques (suite) Intuitivement, la fonction membre pour obtenir le nombre dinstances 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 lon 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 lappel à une de ces fonctions suppose une syntaxe particulièrePOO en C++: Fonctions Membres 309 © 1997-2003 Fabio HERNANDEZ
  55. 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. 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_; } Lutilisation 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. 57. Résumé Les fonctions inline permettent de remplacer les appels aux fonctions membres tout en conservant lencapsulation On peut spécifier des arguments par défaut pour des fonctions (membres et non-membres) Les fonctions membres dune classe ont accès à lobjet sur lequel elles sappliquent 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 daccès Des données et fonctions globales à une classe peuvent être définiesPOO en C++: Fonctions Membres 312 © 1997-2003 Fabio HERNANDEZ
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×