• Aucun résultat trouvé

• Tout comme les attributs, il est possible de déclarer les méthodes comme étant statiques. Une méthode statique est généralement une méthode qui réalise une tâche qui est indépendante des instances et qui est plutôt liée au modèle défini par la classe.

Membres statiques et membres constants d'une classe Programmation orientée objet (C++) _________________________________________________________________________________________________________________

• Une méthode statique est appelée une méthode de classe alors qu'une méthode non statique est appelée une méthode d'instance.

Déclaration d'une méthode statique

Une méthode statique est déclarée dans la définition d'une classe à l'aide du mot-clé static comme suit :

Définition d'une méthode statique

Comme les méthodes classiques, une méthode statique peut être définie à l'intérieur ou à l'extérieur de la classe.

Définition à l'intérieur de la classe

class NomClasse { ... ... ...

static Type NomMethodeStatique(<Liste des paramètres>) { ... }

... ... ... };

Définition à l'extérieur de la classe

La définition d'une méthode statique à l'extérieur de la classe n'utilise pas le mot-clé static. Elle doit être précédée par la déclaration de la méthode à l'intérieur de la classe :

Type NomClasse::NomMethodeStatique(<Liste des paramètres>) { ... }

Appel d'une méthode statique

Appel de l'intérieur de la classe

Une méthode statique peut être appelée de l'intérieur de sa classe comme une méthode classique et ce directement par son nom (sans considération des droits d'accès et sans qualification).

Appel de l'extérieur de la classe

Une méthode statique publique peut être appelée de l'extérieur de la classe à partir :

• Du nom de la classe : NomClasse::NomMethodeStatique(…);

• D'un objet de la classe : NomObjet.NomMethodeStatique(…);

• D'un pointeur sur un objet : NomPtrObjet->NomMethodeStatique(…);

Remarques :

• Une méthode statique :

class NomClasse { ... ... ...

static Type NomMethodeStatique(<Liste des paramètres>); ... ... ...

Membres statiques et membres constants d'une classe Programmation orientée objet (C++) _________________________________________________________________________________________________________________

o Peut appeler les méthodes statiques de sa classe.

o Ne peut pas appeler les méthodes non statiques de sa classe. o Peut appeler les méthodes statiques publiques des autres classes.

o Peut appeler les méthodes d'instances publiques des objets qui sont déclarés en local à l'intérieur de cette méthode.

• Une méthode non statique (méthode d'instance) peut appeler : o Les méthodes statiques et non statiques de sa classe. o Les méthodes statiques publiques des autres classes.

o Les méthodes d'instances publiques des objets qui lui sont locaux.

Accès aux attributs par une méthode statique

• Une méthode statique ne peut accéder qu'aux attributs statiques de sa classe. Elle ne peut pas accéder aux attributs non statiques. En effet, une méthode statique peut être appelée à partir du nom de la classe en dehors de toute création d'objets. Dans ce genre d'appel, aucun attribut non statique ne peut exister en mémoire car de tels attributs sont liés aux instances.

• Une méthode statique ne possède pas de paramètre caché this pour référencer les attributs vu que les seuls attributs qu'elle peut utiliser sont statiques et sont par conséquent uniques et non liés aux instances.

• Une méthode non statique peut accéder à la fois aux champs statiques et non statiques de sa classe. Exemple : class X { int a; static int b; static int c;

int f(){return a+b;}

static int g(){return a-b;} static int h()({return a*b;} };

Etant donnés la classe X définie ci-dessus et obj un objet convenablement instancié de X. Indiquer si les appels suivants sont possibles ou non.

… … … int res; res=obj.f(); res=obj.g(); res=obj.h(); X.f(); X.g(); X.h(); … … … Remarque :

De par sa définition un constructeur doit être capable d'accéder à tous les attributs de sa classe (pour faire la création et l'initialisation de l'objet). Or cette capacité n'est pas à la portée des méthodes statiques. C'est pourquoi un constructeur ne peut pas être déclaré comme étant statique. De même un destructeur ne peut pas être déclaré comme étant statique.

Membres statiques et membres constants d'une classe Programmation orientée objet (C++) _________________________________________________________________________________________________________________ Exemple : class Cercle { int x; int y;

static int Rayon; static int Nb; public :

Cercle(int xi, int yi){x=xi; y=yi; Nb++;} Cercle(){x=0; y=0; Nb++;}

~Cercle(){Nb--;}

void Deplacer(int dx, int dy){x+=dx; y+=dy;} static void SetRayon(int R){Rayon = R;} static int GetNb(){ return Nb;}

void Dessiner(){...} }; int Cercle::Rayon =5; int Cercle::Nb=0; void main() { ...

Cercle c1(2,7);Cercle c2(2,17);Cercle c3(2,27); int Nombre = Cercle::GetNb();

... }

Remarque :

Une méthode statique peut être appelée à la manière des fonctions du langage C (sans nécessiter une création d'instance). C'est pourquoi, dans les nouveaux langages orientés objet on tend à regrouper les fonctions d'une même bibliothèque dans une même classe sous forme de méthodes statiques pour faciliter leur appel.

A titre d’exemple, la classe Math en C# représente la bibliothèque mathématique et ne possède que des méthodes statiques qui peuvent être appelés facilement sans nécessiter la création d'une instance au préalable.

Déclaration : public static double Cos(double d )

Appel direct : double i = Math.Cos(0) ;

Exercice d'application

On considère une classe possédant un attribut qui stocke une valeur entière. Compléter la définition de cette classe pour que l'on puisse calculer à tout moment la moyenne des valeurs stockées dans toutes les instances de la classe.

Solution

class Entier { int Val;

static int Nb; static float Somme; public : Entier() : Val(0) {Nb++;} Entier(int V):Val(V) { Nb++; Somme+=Val; }

Membres statiques et membres constants d'une classe Programmation orientée objet (C++) _________________________________________________________________________________________________________________ ~Entier() { Nb--; Somme-=Val; }

static float Moyenne() {return Somme/Nb;} }; int Entier::Nb=0; float Entier::Somme=0.f; void main() { Entier E1(10); Entier E2(30);

cout<<"La moyenne est :"<<Entier::Moyenne()<<endl; Entier *E3=new Entier(50);

cout<<"La moyenne est :"<<Entier::Moyenne()<<endl; delete E3;

cout<<"La moyenne est :"<<Entier::Moyenne()<<endl; }