Duplicate possible:
Signification de “const” last dans une déclaration de méthode C++?
J'ai un livre où il est écrit quelque chose comme:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Qu'est-ce que ça veut dire?
Une "fonction const", désignée par le mot clé const
après une déclaration de fonction, en fait une erreur de compilation pour cette fonction de classe pour modifier une variable membre de la classe. Cependant, la lecture d'une variable de classe est acceptable à 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" consiste à afficher une fonction de classe comme une fonction normale prenant un pointeur implicite this
name__. Ainsi, une méthode int Foo::Bar(int random_arg)
(sans le const à la fin) a pour résultat une fonction telle que int Foo_Bar(Foo* this, int random_arg)
, et un appel tel que Foo f; f.Bar(4)
correspond en interne à quelque chose comme Foo f; Foo_Bar(&f, 4)
. Maintenant, ajouter le const à la fin (int Foo::Bar(int random_arg) const
) peut alors être compris comme une déclaration avec un pointeur de la manière suivante: int Foo_Bar(const Foo* this, int random_arg)
. Étant donné que le type de this
est dans ce cas const, aucune modification des variables membres n'est possible.
Il est possible d'assouplir la restriction "fonction constante" consistant à ne pas permettre à la fonction d'écrire dans une variable d'une classe. Pour permettre à certaines des variables d'être accessibles en écriture même lorsque la fonction est marquée en tant que "fonction const", ces variables de classe sont marquées avec le mot clé mutable
name__. Ainsi, si une variable de classe est marquée comme étant mutable et qu'une "fonction const" écrit dans cette variable, le code se compilera proprement et la variable pourra être modifiée. (C++ 11)
Comme d'habitude avec le mot clé const
name__, la modification de l'emplacement de la clé const Word dans une instruction C++ a des significations totalement différentes. L'utilisation ci-dessus de const
s'applique uniquement lorsque vous ajoutez const
à la fin de la déclaration de fonction après la parenthèse.
const
est un qualificatif très surutilisé en C++: la syntaxe et le classement ne sont souvent pas simples en combinaison avec des pointeurs. Quelques lectures sur l'exactitude const
et le mot clé const
name__:
Considérons deux variables de type classe:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
Vous pouvez maintenant appeler la fonction membre toute de Boo
sur b0
, mais uniquement const
- fonctions membres qualifiées sur b1
.
Bar
est garanti pour ne pas changer l'objet pour lequel il est appelé. Voir le section sur l'exactitude de const dans la FAQ C++, par exemple.
La fonction ne peut pas modifier ses paramètres via le pointeur/la référence que vous lui avez donné.
Je vais à cette page chaque fois que je dois y penser:
http://www.parashift.com/c++-faq-lite/const-correctness.html
Je crois qu'il y a aussi un bon chapitre dans "Plus efficace C++" de Meyers.
Je trouve toujours conceptuellement plus facile de penser que vous faites le const ce pointeur (qui est à peu près ce qu'il fait).