Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Programmation > Lecture du tutoriel

Eléments statiques et constants

Avatar
Auteur : M@teo21
Créé : le 13/09/2007 14:13:57
Modifié : le 15/09/2007 13:40:03
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous tenez le coup ? ^^
Courage, vos efforts seront bientôt largement récompensés.

Ce chapitre va d'ailleurs vous permettre de souffler un peu. Vous allez découvrir quelques notions spécifiques aux classes en C++ : les attributs et méthodes statiques et constants. Ce sont ce que j'appellerais des "points particuliers" du C++. Ce ne sont pas des détails pour autant, ce sont des choses à connaître.

Car oui, tout ce que je vous apprends là, vous allez en avoir besoin et vous allez largement le réutiliser. Je suis sûr aussi que vous en comprendrez mieux l'intérêt lorsque vous pratiquerez pour de bon.
N'allez pas croire que les programmeurs ont inventé des trucs un peu complexes comme ça juste pour le plaisir de programmer de façon tordue :p
Sommaire du chapitre :
Chapitre précédent Sommaire

Les méthodes constantes

On en a rapidement parlé lorsqu'on a introduit les accesseurs (méthodes get/set pour accéder aux attributs), mais je pense que ça vaut le coup de faire le point complètement sur cette notion ici. Ca sera court, mais au moins vous le retiendrez bien et vous ne serez pas surpris si vous voyez des gens en faire.

Euh de quoi je parle ? Des méthodes constantes ! :D
Ce sont des méthodes qui possèdent le mot-clé const à la fin de leur prototype et de leur déclaration.

Quand vous dites "ma méthode est constante", vous indiquez au compilateur que votre méthode ne modifie pas l'objet, c'est-à-dire qu'elle ne modifie la valeur d'aucun de ses attributs. Par exemple, une méthode qui se contente d'afficher des informations à l'écran sur l'objet est une méthode constante : elle ne fait que lire les attributs. En revanche, une méthode qui met à jour le niveau de vie d'un personnage ne peut pas être constante ;)

Ca s'utilise comme ceci :

Code : C++
1
2
3
4
5
6
7
8
9
// Prototype de la méthode (dans le .h) :
void maMethode(int parametre) const;
 
 
// Déclaration de la méthode (dans le .cpp) :
void maMethode(int parametre) const
{
 
}


On utilisera souvent le mot-clé const sur les méthodes accesseur (getAttribut), ces méthodes qui se contentent de renvoyer la valeur d'un attribut pour respecter le principe d'encapsulation qui dit que l'attribut doit être privé.

Code : C++
1
2
3
4
int Personnage::getVie() const
{
    return m_vie;
}

Concrètement, ça sert à quoi de créer des méthodes constantes ?


Ca sert à 2 choses principalement :

Les méthodes statiques

Ah les méthodes statiques... Alors ça, c'est un peu spécial ^^
Ce sont des méthodes qui appartiennent à la classe mais pas aux objets instanciés à partir de la classe... En fait, ce sont de bêtes "fonctions" rangées dans des classes qui n'ont pas accès aux attributs de la classe. Ca s'utilise d'une manière un peu particulière.

Le mieux est encore un exemple je pense !


Créer une méthode statique



Dans le .h, le prototype d'une méthode statique ressemble à ceci :

Code : C++
1
2
3
4
5
6
class MaClasse
{
    public:
        MaClasse();
        static void maMethode();
};


Son implémentation dans le .cpp ne possède pas en revanche de mot-clé static :

Code : C++
1
2
3
4
void Personnage::maMethode() // Ne pas remettre "static" dans l'implémentation
{
    cout << "Bonjour !" << endl;
}



Ensuite, dans le main, la méthode statique s'appelle comme ceci :

Code : C++
1
2
3
4
5
6
int main()
{
    Personnage::maMethode();
 
    return 0;
}


Mais... on n'a pas créé d'objet de type Personnage et on appelle la méthode quand même ? C'est quoi ce bazar ?


C'est justement ça la particularité des méthodes statiques. Pour les utiliser, pas besoin de créer un objet. Il suffit juste de faire précéder le nom de la méthode par le nom de la classe suivi de deux deux-points.
D'où le : Personnage::maMethode();

Cette méthode, comme je vous le disais, ne peut pas accéder aux attributs de la classe. C'est vraiment une bête fonction, mais rangée dans une classe. Ca permet de regrouper les fonctions dans des classes, par thème, et aussi d'éviter des conflits de nom.


Quelques exemples de l'utilité des méthodes statiques



Les méthodes statiques peuvent vous paraître un tantinet stupides. En effet, à quoi bon avoir inventé le modèle objet si c'est pour autoriser les gens à créer de bêtes "fonctions" regroupées dans des classes ?

La réponse, c'est qu'on a toujours besoin d'utiliser de "bêtes" fonctions même en modèle objet, mais pour être un peu cohérent on les regroupe dans des classes en précisant qu'elles sont statiques.

Il y a en effet des fonctions qui ne nécessitent pas de créer un objet, pour lesquelles ça n'aurait pas de sens.
Des exemples ?


Mmmh mais c'est que ça donne envie de travailler avec Qt tout ça ^^

Les attributs statiques

Il existe aussi ce qu'on appelle des attributs statiques.
Tout comme les méthodes statiques, les attributs statiques appartiennent à la classe et non aux objets créés à partir de la classe.


Créer un attribut statique dans une classe



C'est assez simple en fait : il suffit de rajouter le mot-clé static au début de la ligne.
Un attribut static, bien qu'il soit accessible de l'extérieur, peut très bien être déclaré private ou protected. Appelez ça une exception, car c'en est bien une ^^

Exemple :

Code : C++
1
2
3
4
5
6
7
8
9
class MaClasse
{
    public:
        MaClasse();
 
    private:
        static int monAttribut;
 
};


Sauf qu'on ne peut pas initialiser l'attribut statique ici. Il faut le faire dans l'espace global, c'est-à-dire en dehors de toute classe ou fonction, en dehors du main notamment.

Code : C++
1
2
// Initialiser l'attribut en dehors de toute fonction ou classe (espace global)
int Personnage::monAttribut = 5;


Un attribut déclaré comme statique se comporte comme une variable globale, c'est-à-dire une variable accessible partout dans le code.

Ouaaaah ! Stop !
Tu nous avais pas dit à un moment que les variables globales c'était le mal absolu et que même si ça existait il fallait préférer se pendre plutôt que de les utiliser ? :-°


En effet. Bien qu'il y ait toujours des cas où ça se révèle utile et indispensable, c'est très rarement le cas. De manière générale, fuyez ces variables globales comme la peste.


Créer un attribut statique dans une méthode d'une classe



Il y a un cas particulier : on peut aussi créer une variable statique à l'intérieur d'une méthode d'une classe. Cette fois c'est un peu moins bourrin : la variable ne sera accessible que depuis la méthode où elle se trouve.
Le truc, c'est que la variable ne sera pas supprimée de la mémoire à la fin de la méthode. Elle reste en mémoire et sera réutilisée la prochaine fois que la méthode sera appelée, et ce quel que soit l'objet qui y fait appel.

Pour ceux qui s'en souviennent, c'est exactement le même principe que les variables statiques qu'on avait vues dans le cours de C.


Un exemple sera plus parlant ^^

Code : C++ - MaClasse.h
1
2
3
4
5
class MaClasse
{
    public:
        void methode();
};


Code : C++ - MaClasse.cpp
1
2
3
4
5
6
7
void MaClasse::methode()
{
    static int compteur = 0;
    compteur++;
 
    cout << compteur << endl;
}


Code : C++ - main.cpp
1
2
3
4
5
6
7
8
9
int main()
{
    MaClasse objet1, objet2;
 
    objet1.methode();
    objet2.methode();
 
    return 0;
}


Résultat à l'écran :

Code : Console
1
2


Lors de l'appel de la méthode du premier objet, la variable statique compteur est créée et le nombre 1 est affiché.
Lors de l'appel de la méthode du second objet, la variable statique compteur existe déjà en mémoire donc elle n'est pas recréée. C'est celle créée pour le premier objet qui est réutilisée ici. La preuve : le compteur est incrémenté à nouveau et l'écran affiche 2, ce qui signifie que la variable compteur est la même dans les 2 objets.

Les variables statiques au sein d'une méthode ont une portée limitée à leur méthode. Ce ne sont pas des variables globales et c'est donc déjà bien moins crade :p . Elles peuvent avoir une utilité, comme par exemple compter le nombre d'objets créés à partir d'une classe (il faudrait dans ce cas mettre la variable statique compteur dans le constructeur).

Q.C.M.

Quelle est la particularité d'une méthode constante ?
Un attribut statique se comporte comme...
Comment fait-on appel à une méthode statique ?


Ces points un peu particuliers (mais pas bien compliqués) étant vus, je crois que vous avez suffisamment de bagage théorique pour commencer à pratiquer vraiment le C++.

C'est justement l'objectif de la partie suivante, qui va porter sur la librairie Qt dont je vous parle depuis un petit moment maintenant ;)
Cette librairie est vraiment immense et va vous permettre entre autres choses de créer des fenêtres afin de rendre vos applications bien plus sympathiques d'utilisation.

Vous en avez bavé pendant cette partie, vous avez dû emmagasiner pas mal de nouvelles connaissances, aussi vous pouvez considérer que la partie qui va suivre est la... récompense ^^
Tout ce que vous avez appris jusqu'ici va vous resservir, donc n'hésitez pas à relire les chapitres de cette partie que vous n'auriez pas trop bien compris. Parfois ça se débloque au bout de quelques lectures ! Et si ça débloque pas, tant pis, passez à la pratique quand même, je suis sûr que vous comprendrez mieux tous ces concepts du C++ en travaillant sur du concret !
Chapitre précédent Sommaire
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 62 Zéros connectés | Requêtes SQL 11 requêtes | Temps de génération de la page : Total (SQL) 0.0543s (0.0381s)