Double emploi possible: Signification de “const&rdquo ; dernier 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 "const function" ;, dénotée par le mot-clé const
après une déclaration de fonction, fait que c'est une erreur de compilation pour cette fonction de classe de changer une variable membre de la classe. Cependant, la lecture des variables d'une classe est acceptable à l'intérieur de la fonction, mais l'écriture à l'intérieur de cette fonction génère une erreur de compilation.
Une autre façon de penser à ces fonctions constantes est de considérer une fonction de classe comme une fonction normale prenant un pointeur implicite this
. Ainsi, 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 comme Foo f ; f.Bar(4)
correspondra 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 const this pointer : int Foo_Bar(const Foo* this, int random_arg)
. Comme le type de this
dans ce cas est const, aucune modification des variables membres n'est possible.
Il est possible d'assouplir la restriction "const function"" qui interdit à la fonction d'écrire dans n'importe quelle variable d'une classe. Pour permettre à certaines variables d'être accessibles en écriture 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 dans cette variable, le code sera compilé proprement et la variable pourra être modifiée. (C++11)
Comme d'habitude lorsqu'on utilise le mot-clé const
, changer l'emplacement du mot-clé const dans une déclaration C++ a des significations entièrement différentes. L'utilisation ci-dessus de const
ne s'applique que lorsque l'on ajoute const
à la fin de la déclaration de fonction après les parenthèses.
const
est un qualificatif très sur-utilisé en C++ : la syntaxe et l'ordonnancement ne sont souvent pas simples en combinaison avec les pointeurs. Quelques lectures sur la correction de const
et le mot-clé const
:
[Const correctness][2]
[The C++ 'const' ; Declaration : Why & ; How][3] (en anglais)
[2] : http://en.wikipedia.org/wiki/Const-correctness [3] : http://duramecho.com/ComputerInformation/WhyHowCppConst.html
Similaire à [cette][1] question.
En substance, cela signifie que la méthode Bar
ne modifiera pas les variables membres non [mutables][2] de Foo
.
[1] : https://stackoverflow.com/questions/2157458/using-const-in-classs-functions [2] : https://msdn.microsoft.com/en-us/library/4h2h0ktk.aspx