737 votes

Que signifie "const" à la fin de la déclaration d'une fonction ?

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 ?

33 votes

Il change le type de this de Foo* const sur const 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.

1209voto

Janick Bernet Points 6465

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é :

La correction des constantes

La déclaration "const" en C++ : Pourquoi et comment

7 votes

@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.

3 votes

@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.

4 votes

@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.

70voto

Nikolai N Fetissov Points 52093

Considérons deux variables de type classe :

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

Vous pouvez maintenant appeler cualquier fonction membre de Boo sur b0 mais seulement const -Les fonctions membres qualifiées sur b1 .

19voto

mkluwe Points 1573

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.

12 votes

N'oubliez pas mutable mot-clé.

14voto

JLWarlow Points 2035

Similaire à este question.

En substance, cela signifie que la méthode Bar ne modifiera pas les éléments non mutable variables membres de Foo .

10voto

Goz Points 35007

Je trouve toujours plus facile, d'un point de vue conceptuel, de penser que vous rendez ce pointeur constant (ce qui est à peu près ce qu'il fait).

10 votes

En fait, pas le this Le pointeur lui-même est const mais ce qu'il désigne, à savoir *this ;)

Prograide.com

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.

Powered by:

X