Que signifie “const” en fin de déclaration de fonction?

Duplication possible:
Signification de “const” dernier dans une déclaration de méthode C ++?

Salut j’ai un livre, où il est écrit quelque chose comme:

class Foo { public: int Bar(int random_arg) const { // code } }; 

En outre, une question à propos: pourquoi devrais / ne devrais-je pas utiliser const avant les déclarations d’arguments? Qu’est-ce que ça change?

 int Foo (const int Bar) { /* code */ } 

EDIT: Donc si je le fais maintenant:

 Foo v1, v2; 

La fonction de barre (const-tagged) existera-t-elle 3 fois ou 1 fois en mémoire?

Une “fonction const”, désignée par le mot clé const après une déclaration de fonction, fait de cette fonction une erreur du compilateur pour modifier une variable membre de la classe. Cependant, la lecture d’une variable de classe est correcte à l’intérieur de la fonction, mais l’écriture à l’intérieur de cette fonction générera une erreur de compilation.

Une autre façon de penser à cette “fonction const” est de voir une fonction de classe comme une fonction normale en prenant un pointeur implicite. Donc, une méthode int Foo::Bar(int random_arg) (sans le const à la fin) donne une fonction comme int Foo_Bar(Foo* this, int random_arg) , et un appel tel que Foo f; f.Bar(4) Foo f; f.Bar(4) correspondra en interne à quelque chose comme Foo f; Foo_Bar(&f, 4) Foo f; Foo_Bar(&f, 4) . Maintenant, append le const à la fin ( int Foo::Bar(int random_arg) const ) peut alors être compris comme une déclaration avec un pointeur const: int Foo_Bar(const Foo* this, int random_arg) . Étant donné que le type de this type est const, aucune modification des variables membres n’est possible.

Il est possible de desserrer la ressortingction “const fonction” de ne pas autoriser la fonction à écrire dans une variable d’une classe. Pour permettre l’écriture de certaines variables même lorsque la fonction est marquée comme une “fonction const”, ces variables de classe sont marquées avec le mot clé mutable . Ainsi, si une variable de classe est marquée comme mutable et qu’une “fonction const” écrit sur cette variable, le code sera compilé proprement et la variable pourra être modifiée. (C ++ 11)

Comme d’habitude, lorsque vous const mot-clé const , changer l’emplacement du mot-clé const dans une instruction C ++ a des significations entièrement différentes. L’utilisation de const ci-dessus ne s’applique que lors de l’ajout de const à la fin de la déclaration de fonction après la parenthèse. const est un qualificatif fortement surexploité en C ++ et la syntaxe et le classement ne sont souvent pas simples en combinaison avec des pointeurs. Quelques lectures sur la correction de const et le mot-clé const :

La constance des constantes

La déclaration C ++ ‘const’: pourquoi et comment

Considérons deux variables de type classe:

 class Boo { ... }; Boo b0; // mutable object const Boo b1; // non-mutable object 

Maintenant, vous êtes en mesure d’appeler n’importe quelle fonction membre de Boo sur b0 , mais uniquement sur les fonctions membres const qualifiées sur b1 .

Bar est garantie de ne pas modifier l’object sur lequel elle est appelée. Voir la section sur la correction de const dans la FAQ C ++, par exemple.

Similaire à cette question.

Essentiellement, cela signifie que la méthode Bar ne modifiera pas les variables membres non mutables de Foo .

Je trouve toujours conceptuellement plus facile de penser que vous faites le pointeur const (ce qui est à peu près ce qu’il fait).

Fonction ne peut pas changer ses parameters via le pointeur / référence que vous lui avez donné.

Je vais sur cette page chaque fois que j’ai besoin d’y penser:

http://www.parashift.com/c++-faq-lite/const-correctness.html

Je crois qu’il y a aussi un bon chapitre dans Meyers “More Effective C ++”.