Objectifs. Objectifs. Héritage. Copie profonde. Attributs et méthodes de classes. Jamila Sam. Objectifs. Objectifs. Héritage.

Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Premiers Pas en Programmation Objet : les Classes et les Objets

Chapitre VI- La validation de la composition.

TP1 : Initiation à Java et Eclipse

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Objets et Programmation. origine des langages orientés-objet

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Initiation à JAVA et à la programmation objet.

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Chapitre 2. Classes et objets

Une introduction à Java

Programmer en JAVA. par Tama

et Programmation Objet

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Tp 1 correction. Structures de données (IF2)

Héritage presque multiple en Java (1/2)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

as Architecture des Systèmes d Information

Classes et Objets en Ocaml.

Java c est quoi? Java pourquoi?

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Cours d initiation à la programmation en C++ Johann Cuenin

I. Introduction aux fonctions : les fonctions standards

Cours Programmation Système

Projet gestion d'objets dupliqués

Programmation MacOSX / ios

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Remote Method Invocation (RMI)

Java 1.5 : principales nouveautés

INITIATION AU LANGAGE JAVA

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Environnements de développement (intégrés)

Threads. Threads. USTL routier 1

Génie Logiciel avec Ada. 4 février 2013

Les structures de données. Rajae El Ouazzani

Java Licence Professionnelle CISII,

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Plan Pédagogique du cours

Auto-évaluation Programmation en Java

Corrigés des premiers exercices sur les classes

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Introduction à l héritage en C++

Cours 1: Java et les objets

RMI le langage Java XII-1 JMF

Programmation Orientée Objet application au langage Java Version Novembre 2007

Cours de Systèmes d Exploitation

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation stochastique

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

UE Programmation Impérative Licence 2ème Année

2. Comprendre les définitions de classes

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Programmation avec des objets : Cours 7. Menu du jour

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Programmation par les Objets en Java

Les arbres binaires de recherche

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Programmation Objet Java Correction

Java Naming and Directory Interface

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Traduction des Langages : Le Compilateur Micro Java

Java DataBaseConnectivity

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

1.6- Génération de nombres aléatoires

Arbres binaires de recherche

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Créer et partager des fichiers

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

OS Réseaux et Programmation Système - C5

Langage Java. Classe de première SI

Création et utilisation de formulaire pdf

Utilisation d objets : String et ArrayList

TD3: tableaux avancées, première classe et chaînes

Gestion d identités PSL Exploitation IdP Authentic

Plan du cours Cours théoriques. 29 septembre 2014

Gestion mémoire et Représentation intermédiaire

PROJET 1 : BASE DE DONNÉES REPARTIES

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Programmation Orientée Objet

L exclusion mutuelle distribuée

Cours de Master Recherche

Transcription:

du cours d aujourd hui Informatique II : Cours de programmation (C++) Haroud Laboratoire d Intelligence Artificielle Faculté I&C Ce cours a pour but : de présenter en détail la notion fondamentale d héritage de vous présenter encore quelques subtilités au sujet des constructeurs et des destructeurs d introduire la notion d attribut (et méthode) statique à une classe Informatique II Cours 6 : 1 / 44 Informatique II Cours 6 : 2 / 44 Après les notions d encapsulation et d abstraction, le troisième aspect essentiel des objets est la notion d héritage Hiérarchie de un exemple L héritage est une technique extrêmement efficace pour créer des plus spécialisées, appelées sous-, à partir de plus générales déjà existantes, appelées super-. Elle représente la relation «est-un» Rectangle Figure Géométrique Partitionnement Cercle hérite de Classe Enrichissement/ Spécialisation Spécialisation Sous classe Sous classe Sous classe Sphère Cylindre Informatique II Cours 6 : 3 / 44 Informatique II Cours 6 : 4 / 44

(2) (3) Plus précisément, lorsqu une sous-classe C1 est créée à partir d une classe C, C1 va hériter de (i.e. recevoir) l ensemble : des attributs de C des C (sauf les constructeurs/destructeurs) Les attributs et C vont être disponibles pour C1 sans que l on ait besoin de les redéfinir explicitement dans C1. De plus : le type est aussi hérité : C1 est (aussi) un C : Pour un C x; et un C1 y;, on peut tout à fait faire : x = y; (mais bien sûr pas y = x;!!!) L héritage permet donc : d expliciter des relations structurelles et sémantiques entre de réduire les redondances de description et de stockage des propriétés Par ailleurs : des attributs et/ou méthodes supplémentaires peuvent être définis par la sous-classe C1 ces membres constituent l enrichissement apporté par cette sous-classe. Informatique II Cours 6 : 5 / 44 Informatique II Cours 6 : 6 / 44 (4) (5) Supposons par exemple que l on veuille étendre la classe Rectangle précédemment définie en lui ajoutant le nouvel attribut couleur. Une façon de procéder est de créer une nouvelle classe, par exemple RectangleColore, définie comme une sous-classe de Rectangle et contenant le nouvel attribut couleur. Par transitivité, les instances d une sous-classe possèdent : les attributs et méthodes (hors constructeurs/destructeur) de l ensemble des parentes (classe parente, classe parente de la parente, etc...) Classe Rectangle largeur hauteur La notion d enrichissement par héritage : crée un réseau de dépendances entre, hérite de Classe RectangleColore couleur ce réseau est organisé en une structure arborescente où chacun des nœuds hérite des propriétés de l ensemble des nœuds du chemin remontant jusqu à la racine. ce réseau de dépendance définit une hiérarchie de on évite ainsi de dupliquer inutilement du code commun aux Rectangle et RectangleColore! Informatique II Cours 6 : 7 / 44 Informatique II Cours 6 : 8 / 44

Passons à la pratique... Accès aux membres d une sous-classe Définition d une sous-classe en C++ : Syntaxe : Jusqu à maintenant, l accès aux membres (attributs et méthodes) d une classe pouvait être : class NomClasseEnfant : public NomClasseParente /* Déclaration des attributs et méthodes spécifiques à la sous-classe */ class RectangleColore : public Rectangle Couleur couleur; soit public : visibilité totale à l intérieur et à l extérieur de la classe (mot-clé public) soit privé : visibilité uniquement à l intérieur de la classe (mot-clé private ou par défaut) Un troisième type d accès régit l accès aux attributs/méthodes au sein d une hiérarchie de : l accès protégé : assure la visibilité des membres d une classe dans les de sa descendance [et uniquement elles, et uniquement dans ce rôle (de sous classe, voir exemple plus loin)]. Le mot clé est «protected». Informatique II Cours 6 : 9 / 44 Informatique II Cours 6 : 10 / 44 Définition des niveaux d accès Accès protégé L ordre de définition conseillé est le suivant : // lien d heritage si necessaire seulement class NomClasse : public NomClasseParente // par defaut : private // attributs et methodes public protected: // attributs et methodes protected Le niveau d accès protégé correspond à une extension du niveau privé aux membres des sous- class Rectangle Rectangle(): largeur(1.0), hauteur(2.0) protected: double largeur; double hauteur; private: // attributs et methodes private Mais il peut y avoir plusieurs zones publiques, protégées ou privées dans une même définition de classe. class RectangleColore : public Rectangle // on profite ici de protected void carre() largeur = hauteur; protected: Couleur couleur; Informatique II Cours 6 : 11 / 44 Informatique II Cours 6 : 12 / 44

Accès protégé (2) Le niveau d accès protégé correspond à une extension du niveau privé aux membres des sous-... mais uniquement dans ce rôle (de sous-classe) pas dans le rôle de classe extérieure : class A protected: int a; private: int prive; class B: public A void f(b autreb, A autrea, int x) a = x; // OK A::a est protected => acces possible // prive = x; // erreur : A::prive est private Restriction des accès lors de l héritage Les niveaux d accès peuvent être modifiés lors de l héritage Syntaxe : class ClasseEnfant: [accès] classeparente /* Déclaration des membres spécifiques à la sous-classe */ où accès est le mot-clé public, protected ou private. Les crochets entourant un élément [ ] indiquent qu il est optionnel. // a += autreb.prive; // erreur (meme raison) a += autreb.a; // OK : dans la meme classe (B) // a += autrea.a; // INTERDIT! : this n est pas de la meme // classe que autrea (role externe) Les droits peuvent être conservés ou restreints, mais jamais relachés! Par défaut, l accès est privé. Informatique II Cours 6 : 13 / 44 Informatique II Cours 6 : 14 / 44 Restriction des accès lors de l héritage (2) Utilisation des droits d accès Récapitulatif des changements de niveaux d accès aux membres hérités, en fonction du niveau initial et du type d héritage : Membres publics : accessibles pour les programmeurs utilisateurs de la classe héritage accès initial public protected private public public protected pas d accès protected protected protected pas d accès private private private pas d accès Le type d héritage constitue une limite supérieure à la visibilité. Membres protégés : accessibles aux programmeurs d extensions par héritage de la classe Membres privés : pour le programmeur de la classe : structure interne, modifiable si nécessaire sans répercussions ni sur les utilisateurs ni sur les autres programmeurs. Informatique II Cours 6 : 15 / 44 Informatique II Cours 6 : 16 / 44

Masquage dans une hiérarchie Masquage dans une hiérarchie (2) Masquage : un identificateur qui en cache un autre Situation possible dans une hiérarchie : Rectangle... double surface() return(largeur*hauteur); Même nom d attribut/méthode utilisé sur plusieurs niveaux Peu courant pour les attributs Très courant et pratique pour les méthodes Rectangle3D hérite de Rectangle calcul de la surface pour les Rectangle3D 2* (largeur*hauteur) + 2*(largeur*profondeur) + 2*(hauteur*profondeur) calcul de la surface pour tous les autres Rectangle : (largeur*hauteur) Faut-il re-concevoir toute la hiérarchie? Non, on ajoute simplement une méthode surface spéciale à Rectangle3D Rectangle3D:Rectangle... double surface() return(2*largeur*hauteur + 2*largeur*...); La méthode surface de Rectangle3D masque celle de Rectangle Un objet de type Rectangle3D n utilisera donc jamais la méthode surface de la classe Rectangle Vocabulaire OO : Méthode héritée = méthode générale, méthode par défaut Méthode qui masque la méthode héritée = méthode spécialisée Informatique II Cours 6 : 17 / 44 Informatique II Cours 6 : 18 / 44 Masquage dans une hiérarchie (3) Accès à une méthode masquée class Rectangle // les constructeurs seraient ici... double surface() return (largeur*hauteur); Il est parfois souhaitable d accéder à une méthode/un attribut caché(e) protected: double largeur; double hauteur; class Rectangle3D : public Rectangle // les constructeurs seraient ici... double surface() // Masquage! return(2.0*(largeur*hauteur) + 2.0*(largeur*profondeur) + 2.0*(hauteur*profondeur)); protected: double profondeur; surface des Rectangle3D ayant une profondeur nulle (largeur*hauteur) identique au calcul de surface pour les Rectangle Code désiré : 1. Objet non-rectangle3d : Méthode générale (surface de Rectangle) 2. Objet Rectangle3D : Méthode spécialisée (surface de Rectangle3D) 3. Objet Rectangle3D de profondeur nulle : D abord la méthode spécialisée Ensuite appel à la méthode générale depuis la méthode spécialisée Informatique II Cours 6 : 19 / 44 Informatique II Cours 6 : 20 / 44

Accès à une méthode cachée (2) Constructeurs et héritage Pour accéder aux attributs/méthodes caché(e)s de la super-classe : on utilise l opérateur de résolution de portée Syntaxe : NomClasse::methode ou attribut Rectangle::surface() class Rectangle3D : public Rectangle constructeurs, attributs comme avant double surface () if (profondeur == 0.0) // Acces a la methode masquee return Rectangle::surface(); else return(2.0*(largeur*hauteur) + 2.0*(largeur*profondeur) + 2.0*(hauteur*profondeur)); Lors de l instanciation d une sous-classe, il faut initialiser : les attributs propres à la sous-classe les attributs hérités des super- MAIS......il ne doit pas être à la charge du concepteur des sous- de réaliser lui-même l initialisation des attributs hérités L accès à ces attributs peut notamment être interdit! (private) L initialisation des attributs hérités doit donc se faire au niveau des où ils sont explicitement définis. Solution : l initialisation des attributs hérités doit se faire en invoquant les constructeurs des super-. Informatique II Cours 6 : 21 / 44 Informatique II Cours 6 : 22 / 44 Constructeurs et héritage (2) Constructeurs et héritage (3) L invocation du constructeur de la super-classe se fait au début de la section d appel aux constructeurs des attributs. Syntaxe : SousClasse(liste d arguments) : SuperClasse(Arguments), attribut1(valeur1),... attributn(valeurn) // corps du constructeur Si la classe parente n admet pas de constructeur par défaut, l invocation explicite d un de ses constructeurs est obligatoire dans les constructeurs de la sous-classe La sur-classe doit admettre au moins un constructeur explicite. class Rectangle protected: double largeur; double hauteur; Rectangle(double l, double h) : largeur(l), hauteur(h) Lorsque la super-classe admet un constructeur par défaut, l invocation explicite de ce constructeur dans la sous-classe n est pas obligatoire le compilateur se charge de réaliser l invocation du constructeur par défaut class Rectangle3D : public Rectangle protected: double profondeur; Rectangle3D(double l, double h, double p) // Appel au constructeur de la super-classe : Rectangle(l,h), profondeur(p) Informatique II Cours 6 : 23 / 44 Informatique II Cours 6 : 24 / 44

Constructeurs et héritage (4) Encore un exemple Autre exemple (qui ne fait pas la même chose) : class Rectangle protected: double largeur; double hauteur; // il y a un constructeur par defaut! Rectangle() : largeur(0.0), hauteur(0.0) class Rectangle3D : public Rectangle protected: double profondeur; Rectangle3D(double p) : profondeur(p) Il n est pas nécessaire d avoir des attributs supplémentaires... class Carre : public Rectangle Carre(double taille) : Rectangle(taille, taille) // et c est tout! (sauf s il y avait des "methodes set") Ici il n est pas nécessaire d invoquer explicitement le constructeur de la classe parente puisque celle-ci admet un constructeur par défaut. Informatique II Cours 6 : 25 / 44 Informatique II Cours 6 : 26 / 44 Ordre d appel des constructeurs Ordre d appel des destructeurs Hiérachie de Classe A a1 a2 m1(...) m2(...) Classe B b1 m3(...) m4(...) Constructeurs A(...) : a1(...), a2(...) B(...) : A(...), b1(...) 1 2 Instance a1 a2 a1 b1 a2 Les destructeurs sont toujours appelés dans l ordre inverse (/symétrique) des constructeurs. Par exemple dans l exemple précédent, lors de la destruction d un C, on aura appel et exécution de : C:: C() B:: B() A:: A() (et dans cet ordre) (puisque les constructeurs avaient été appelés dans l ordre Classe C c1 m5(...) c2 instanciation : C mon_c(...); C(...) : B(...), c1(...), c2(...) 3 a1 b1 c1 a2 c2 mon_c ) A::A() B::B() C::C() Informatique II Cours 6 : 27 / 44 Informatique II Cours 6 : 28 / 44

des constructeurs Les constructeurs ne sont, en général, pas hérités mais en on peut demander leur héritage en utilisant le mot clé «using». On récupère alors tous les constructeurs de la super-classe, i.e. on peut construire la sous-classe avec les mêmes arguments, mais... Attention! ces constructeurs n initalisent donc pas les attributs spécifiques de la sous-classe. C est donc très risqué, et je vous conseille de ne l utiliser que pour des sous- n ayant pas de nouvel attribut (et si c est approprié)! Spécifier un lien d héritage : class Sousclasse : [public] SuperClass... Droits d accès : protected accès autorisé au sein de la hiérarchie Masquage : un attribut/méthode peut être redéfini dans une sous-classe Accès à un membre caché : SuperClasse::membre Le constructeur d une sous classe doit faire appel au constructeur de la super classe : class A A(int); A(double, double); class B : public A using A::A; // ICI /* existent alors maintenant B::B(int) et B::B(double, double) */ class SousClasse: SuperClasse SousClasse(liste de paramètres) : SuperClasse(Arguments), attribut1(valeur1),..., attributn(valeurn)... Informatique II Cours 6 : 29 / 44 Informatique II Cours 6 : 30 / 44 Petit rappel Petit rappel (2) Lors du cours précédent, nous avons vu qu il existe en C++, des méthodes particulières permettant : d initialiser les attributs d un objet en début de vie : constructeurs de copier un objet dans un autre objet : constructeurs de copie de libérer les ressources utilisées par un objet en fin de vie : destructeurs Dans certains cas, les versions minimales par défaut des méthodes constructeurs/destructeurs ne sont pas adaptées : exemple du comptage des instances. Autre exemple : Le constructeur de copie par défaut réalise une copie membre à membre des attributs copie de surface Une version par défaut, minimale, de ces méthodes est automatiquement générée si on ne les définit pas explicitement. Ceci pose typiquement problème lorsque certains attributs de la classe sont des pointeurs. Examinons pourquoi sur un exemple concret... Informatique II Cours 6 : 31 / 44 Informatique II Cours 6 : 32 / 44

Exemple Exemple (2) Soit une autre définition (farfelue, mais possible!) de la classe Rectangle : class Rectangle private: double* largeur; // aie, un pointeur! double* hauteur; Rectangle(double l, double h) : largeur(new double(l)), hauteur(new double(h)) ~Rectangle() delete largeur; delete hauteur; double getlargeur() const; double gethauteur() const;... Que se passe-t-il lorsqu on invoque la fonction suivante? void afficher_largeur(rectangle tmp) cout << "Largeur: " << tmp.getlargeur() << endl; void afficher_largeur(rectangle tmp) // une copie!.. cout << "Largeur: " << tmp.getlargeur() << endl; // destruction de tmp... Lorsque afficher_largeur a fini de s exécuter, l objet tmp est automatiquement détruit par le destructeur de la classe Rectangle le destructeur va libérer la mémoire pointée par les champs largeur et hauteur de tmp Attention! cette portion de mémoire est aussi utilisée par r dans un appel comme afficher_largeur(r)! Informatique II Cours 6 : 33 / 44 Informatique II Cours 6 : 34 / 44 Exemple (3) Exemple (4) Voilà ce qui se produit concrètement : Avant la copie r largeur hauteur tmp?? Après la copie Une bonne solution consiste alors à redéfinir le constructeur de copie : Rectangle(const Rectangle& obj) : largeur(new double(*(obj.largeur))), hauteur(new double(*(obj.hauteur))) Avant la copie r largeur hauteur tmp r largeur hauteur tmp?? Après la copie Après la destruction de tmp r largeur hauteur tmp r tmp il faut redéfinir le constructeur de copie de sorte à ce qu il duplique véritablement les champs concernés copie profonde Après la desctruction de tmp r tmp Informatique II Cours 6 : 35 / 44 Informatique II Cours 6 : 36 / 44

Définition complète de la classe Pour conclure class Rectangle Rectangle(double l, double h) : largeur(new double(l)), hauteur(new double(h)) Rectangle(const Rectangle& obj); ~Rectangle(); // Note: il faudrait aussi redefinir operator=! private: double* largeur; double* hauteur; // constructeur de copie Rectangle::Rectangle(const Rectangle& obj) : largeur(new double(*(obj.largeur))), hauteur(new double(*(obj.hauteur))) // destructeur void Rectangle::~Rectangle() delete largeur; delete hauteur; Si une classe contient des pointeurs, penser à la copie profonde (au moins se poser la question) : constructeur de copie ; surcharge de l opérateur = ; destructeur. Remarque : si l on redéfinit le constructeur de copie d une sous-classe, penser à explicitement mettre l appel au constructeur de copie de la super-classe (sinon c est le constructeur par défaut de la super-classe qui est appelé!!) RectangleColore(const RectangleColore& obj) : Rectangle(obj),...etc......etc... Il faudra aussi penser à redéfinir l opérateur = Informatique II Cours 6 : 37 / 44 Informatique II Cours 6 : 38 / 44 Attributs statiques Attributs statiques (2) Revenons à notre exemple du comptage des instances : long compteur(0); // Hmm... class Rectangle //constructeur Rectangle(): hauteur(0.0), largeur(0.0) ++compteur; // destructeur ~Rectangle() --compteur; Oh horreur!.. Nous avons utilisé une variable globale comme compteur pour nos instances. La solution à ce problème consiste à utiliser un attribut statique : un attribut statique est partagé par toutes les instances de la même classe (on parle aussi d «attribut de classe») c est un attribut de la classe qui peut être privé, protégé ou public et dont la déclaration est précédée du mot clé static il existe même lorsqu aucune instance de la classe n est déclarée class Rectangle private: double hauteur, largeur; static int compteur; // un membre statique! C est très mauvais! (effets de bord, mauvaise modularisation, contraire au principe d encapsulation, etc.) Informatique II Cours 6 : 39 / 44 Informatique II Cours 6 : 40 / 44

Initialisation des attributs statiques Méthodes statiques un attribut statique doit être initialisé explicitement à l extérieur de la classe /* initialisation de l attribut statique dans le fichier de definition de la classe (.cc) */ int Rectangle::compteur = 0; /* Rectangle::compteur existe meme si l on n a declare aucune instance de la classe Rectangle */ Les attributs statiques sont très pratiques lorsque différents objets d une classe doivent accéder à une même information. Similairement, si on ajoute static à une méthode : On peut accéder à la méthode à travers un objet mais aussi sans objet (à partir du nom de la classe et de l opérateur ::) class A void methode1 () cout << "Methode 1" << endl; static void methode2 () cout << "Methode 2" << endl; Elle permettent notamment d éviter que cette information soit dupliquée au niveau de chaque objet! Concrètement : réserver cet usage à des constantes utiles pour toutes les instances de la classe. int main () A v; v.methode1(); v.methode2(); A::methode2(); A::methode1(); //OK //OK //OK, alternative //Faux Informatique II Cours 6 : 41 / 44 Informatique II Cours 6 : 42 / 44 Restrictions sur les méthodes statiques Ce que j ai appris aujourd hui Puisqu une méthode statique peut être appelée avec ou sans objet : Le compilateur ne peut pas être sûr que l objet this existe pendant l exécution de la méthode Il ne peut donc pas admettre l accès aux variables/méthodes d instance (car elles dépendent de this) Conclusion pour les accès dans la même classe : Une méthode statique peut seulement accéder à d autres méthodes statiques et à des variables statiques Le recours à des méthodes statiques ne se justifie que dans des situations très particulières Évitez la prolifération de static! que l on peut réduire la duplication de code et reproduire de bon modèles de la réalité en utilisant des hiérarchies de qu une sous classe hérite des membres de ses parentes que pour implémenter la notion d héritage il faut avoir recours dans les constructeurs à : et l appel aux constructeurs des super- par quel mécanisme (::) on peut gérer le masquage d attributs et de méthodes dans une hiérarchie de que la définition explicite du constructeurs de copie et du destructeurs ainsi que la surcharge de l opérateur = sont absolument nécessaires lorsque la classe réalise de l allocation dynamique de mémoire (cas de la copie profonde) qu un attribut ou méthode statique est commun à toutes les instances d une classe je peux maintenant améliorer la modularisation de mes programmes orientés objet en C++ et faire de la conception de programmes plus ambitieux. Informatique II Cours 6 : 43 / 44 Informatique II Cours 6 : 44 / 44