web-dev-qa-db-fra.com

Que veut-on dire par "const" à la fin de la déclaration de fonction?

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?

470
aPoC

Une "fonction const", désignée par le mot clé constaprè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 thisname__. 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 thisest 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é mutablename__. 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é constname__, 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 consts'applique uniquement lorsque vous ajoutez constà la fin de la déclaration de fonction après la parenthèse.

constest 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 constet le mot clé constname__:

Constante correction

La déclaration 'const' C++: Pourquoi & Comment

789
Janick Bernet

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.

39
Nikolai Fetissov

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.

12
mkluwe

Similaire à this question.

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

8
JLWarlow

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.

8
orbfish

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

7
Goz