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 cela signifie ?
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 cela signifie ?
Une "fonction const", désignée par le mot-clé const
après une déclaration de fonction, fait en sorte qu'une erreur de compilation se produise lorsque cette fonction de classe modifie 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è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 une valeur implicite de this
pointeur. Ainsi, une méthode int Foo::Bar(int random_arg)
(sans le const à la fin) donne une fonction telle que int Foo_Bar(Foo* this, int random_arg)
et un appel tel que Foo f; f.Bar(4)
correspondra en interne à quelque chose comme Foo f; Foo_Bar(&f, 4)
. Ajoutons maintenant la constante à la fin ( int Foo::Bar(int random_arg) const
) peut alors être compris comme une déclaration avec un pointeur const this : int Foo_Bar(const Foo* this, int random_arg)
. Puisque 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 constante", 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 se compile proprement et la variable peut être modifiée. (C++11)
Comme d'habitude, lorsqu'on traite avec le const
le changement de l'emplacement du mot-clé const dans une instruction C++ a des significations totalement différentes. L'utilisation ci-dessus de const
s'applique uniquement lorsque l'on ajoute const
à la fin de la déclaration de la fonction après la parenthèse.
const
est un qualificatif très surutilisé en C++ : la syntaxe et l'ordonnancement ne sont souvent pas simples en combinaison avec les pointeurs. Certaines lectures sur const
l'exactitude et la const
mot-clé :
@ereOn, si vous avez aimé mutable, vous pourriez aimer ceci. Le cas d'utilisation le plus courant de "mutable" est celui d'un modificateur pour un mutex contrôlant l'accès à une instance de classe. Ce n'est pas parce que vous promettez de ne pas modifier l'instance que ce que vous lisez ne sera pas modifié par quelqu'un d'autre détenant une référence non-const à cette instance.
@Janick, j'ai appris le c++ par moi-même pendant un an ou deux, je n'ai jamais vu de livres couvrant une explication comme celle-ci et je pense que c'est vraiment utile. Quel type de livres dois-je lire pour apprendre ces choses comme ce pointeur implicite.
@Steven : Je pense que la chose la plus utile serait de lire un livre de C et de voir comment certaines choses de type OO peuvent être implémentées en C. A partir de là, il est plus facile de voir comment les fonctionnalités OO natives du C++ s'appliquent aux constructions de plus bas niveau en C et finalement à la machine.
Bar
est garantie de ne pas modifier l'objet sur lequel elle est invoquée. Voir le section sur la correction des constantes dans la FAQ C++, par exemple.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
33 votes
Il change le type de
this
deFoo* const
surconst Foo* const
. Cela a des conséquences.0 votes
Je ne comprends pas votre montage. Que voulez-vous savoir exactement ? Si déclarer deux variables de type Foo va créer de multiples fonctions instances de Bar ?
0 votes
@inflagranti : Oui, c'est exactement ce que je veux savoir.
0 votes
Alors la réponse est non. Et pourquoi avez-vous supposé que ce serait le cas ?
0 votes
Un ami m'a dit un jour... Mais sans la balise const, n'est-ce pas ?
8 votes
Les fonctions @aPoC (ou ici les méthodes) n'existent qu'une fois "en mémoire" (en étant
static
ou non, cela n'a pas d'importance). On leur passe un paramètre cachéthis
qui est un pointeur vers l'instance appelante.