Bonjour,
Que signifie le mot clé "const" lorsqu'il est placé à la fin d'une déclaration/définition d'une fonction comme ceci:
ou bienCode:void my_fct ( void ) const ;
Code:
1
2 void my_fct ( void ) const { };
Version imprimable
Bonjour,
Que signifie le mot clé "const" lorsqu'il est placé à la fin d'une déclaration/définition d'une fonction comme ceci:
ou bienCode:void my_fct ( void ) const ;
Code:
1
2 void my_fct ( void ) const { };
Déjà, ce const ne s'applique que à des fonctions membres de classe. Je ne pense pas qu'il puisse s'appliquer à des fonctions libres (comprendre à des fonction non membres de classe).
Ce const signifie que la fonction membre ne modifie pas les variables membres de la classe. L'état de l'instance est laissé inchangé.
Typiquement, on trouve sont utilisation dans les getter.
Code:
1
2
3
4
5
6
7
8
9
10 class MaClasse { public : ... int GetAttribute(void) const { return m_attribute; } void SetAttribute(int Val) { m_attribute = val; } private: int m_attribute; }
Merci "ram-0000 " pour la réponse
Ca sert surtout (uniquement?) à s'assurer que la méthode puisse être appelée sur une instance const (et donc respecter le const-correctness).
Les méthodes déclarées avec const peuvent modifier leurs membres si besoins (ceux-ci doivent être mutable). L'aspect constant est plus de l'ordre logique que réellement un figeage de l'état "bit à bit" de l'objet.
Salut,Je confirme...
La raison est simple: le mot clé const signale que la fonction membre s'engage à ne pas modifier l'objet au départ duquel elle est appelée...
Une fonction libre n'a donc strictement aucun intérêt à admettre le const-qualifier dans cette optique, vu que, en toute logique, elle ne fait partie d'aucun objet :D
Par contre, tu es beaucoup trop restrictif en ne citant que les "getters" comme cas typique...
J'aurais plutôt dit qu'on la trouve typiquement lorsque... une fonction n'a pas besoin de modifier l'objet au départ duquel elle est appelée.
Cela va, et sans espérer être exhaustif, du getter "simple" à une fonction membre qui devrait envoyer les données de l'objet vers un flux, en passant par toutes les fonctions permettant d'obtenir l'état de l'objet (le terme "état" étant pris ici dans son sens le plus large, et pouvant être calculé) ou celles qui sont destinées à "parcourir" l'objet (lorsqu'il entre dans une logique impliquant d'autres membres similaires)
Deux autres points importants sont à signaler:
- une fonction membre déclarée constante ne pourra appeler que d'autres fonctions membres déclarées constante
avec un objet non constant- Si une fonction membre constante peut être appelée depuis un objet non constant, une fonction membre non constante ne peut pas être appelée depuis un objet constant.
Ainsi, si on a une classe proche de
doSomething ne peut appeler que someOtherConstOperation (et inversément) mais aucune des deux ne peut appeler doNoConstOperation.Code:
1
2
3
4
5
6
7 class MaClass { public: doSomething() const; someOtherConstOperation() const; doNoConstOperation(); };
Avec un objet non constant, nous pourrons écrire un code proche de
Et, avec un objet constant, nous serons dans la situation suivanteCode:
1
2
3
4
5
6
7
8
9
10 int main() { MaClass c; c.doSomething(); /* OK appel d'une fonction constante depuis un objet * non constant */ c.doNoConstOperation() /* OK apel d'une fonction non constante * depuis un objet non constant */ }
Code:
1
2
3
4
5
6
7
8
9
10
11 int main() { MaClass const c; c.doSomething(); /* OK appel d'une fonction constante depuis un objet * constant */ /* la ligne suivante sera refusée à la compilation */ c.doNoConstOperation() /* !!! KO !!! apel d'une fonction non constante * depuis un objet constant */ }