2010-06-29 5 views
378

Possible en double:
Meaning of “const” last in a C++ method declaration?Que signifie "const" à la fin de la déclaration de fonction?

Salut je me suis un livre, où il est écrit quelque chose comme:

class Foo 
{ 
public: 
    int Bar(int random_arg) const 
    { 
     // code 
    } 
}; 

En outre, un by-the-way question : pourquoi devrais/devrais-je utiliser const avant les déclarations d'argument? Qu'est-ce que ça change?

int Foo (const int Bar) { /* code */ } 

EDIT: Donc, si je fais maintenant:

Foo v1, v2; 

Est-ce que la fonction Bar (étiqueté const-) existent 3 fois ou 1 fois en mémoire?

+1

Duplication de http://stackoverflow.com/questions/751681/meaning-of-const-last-in-ac-method-declaration –

+5

Elle change le type de 'this' de' Foo * const' en 'const Foo * const'. Cela a des conséquences. – sbi

+0

Je ne comprends pas votre édition. Que veux-tu savoir exactement? Si déclarer deux variables de type Foo créera plusieurs instances de Barre de fonctions? –

Répondre

663

Une "fonction const", indiquée par le mot-clé const après une déclaration de fonction, en fait une erreur de compilation pour cette fonction de classe afin de changer une variable membre de la classe. Cependant, la lecture d'une variable de classe est ok à l'intérieur de la fonction, mais écrire à l'intérieur de cette fonction va générer une erreur de compilation. Une autre façon de penser à une telle "fonction const" est de voir une fonction de classe comme une fonction normale prenant un pointeur implicite this. Donc, une méthode int Foo::Bar(int random_arg) (sans le const à la fin) aboutit à une fonction comme int Foo_Bar(Foo* this, int random_arg), et un appel tel que Foo f; f.Bar(4) correspondra intérieurement à quelque chose comme Foo f; Foo_Bar(&f, 4). Ajoutant maintenant le const à la fin (int Foo::Bar(int random_arg) const) peut alors être compris comme une déclaration avec un const ce pointeur: int Foo_Bar(const Foo* this, int random_arg). Puisque le type de this dans un tel cas est const, aucune modification des variables membres n'est possible.

Il est possible de desserrer la restriction "const function" de ne pas permettre à la fonction d'écrire dans une variable d'une classe. Pour permettre l'écriture de certaines variables même lorsque la fonction est marquée comme une "fonction const", ces variables de classe sont marquées du 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 compilera proprement et la variable pourra être modifiée. (C++ 11)

Comme d'habitude lorsqu'il s'agit du mot-clé const, la modification 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 vous ajoutez const à la fin de la déclaration de fonction après la parenthèse. const est un qualificateur fortement surutilisé en C++ et la syntaxe et l'ordre n'est souvent pas simple en combinaison avec des pointeurs. Quelques lectures sur const exactitude et le mot-clé const:

Const correctness

The C++ 'const' Declaration: Why & How

+1

@ereOn, si vous avez aimé mutable, vous pourriez aimer ça. Le cas d'utilisation le plus courant pour "mutable" est en tant que modificateur pour un mutex contrôlant l'accès à une instance de classe. Tout simplement parce que vous promettez de ne pas modifier l'instance, cela ne signifie pas que ce que vous lisez ne sera pas modifié par quelqu'un d'autre qui contient une référence non-const. –

+1

@Janick, j'ai appris le C++ par moi-même pendant un an ou deux, je ne vois jamais de livres couvrir 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 ceci implicite ce pointeur. – Steven

+1

@Steven: Je pense que la chose la plus utile pourrait être de lire réellement un livre C et comment certaines choses comme OO peuvent être implémentées en C simple. De cela, il est plus facile de voir comment les fonctionnalités OO natives C++ mappent plus bas construit en C et finalement jusqu'à la machine. –

7

similaires à this question.

Essentiellement, cela signifie que la méthode Bar ne modifiera pas les variables membres mutable de Foo.

9

Bar est garanti de ne pas changer l'objet sur lequel il est appelé. Voir le section about const correctness dans la FAQ C++, par exemple.

+8

N'oubliez pas le mot clé 'mutable' –

6

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

+2

En fait, pas le pointeur' this' lui-même est 'const', mais ce qu'il pointe vers, c'est' 'this'; – fredoverflow

29

Tenir compte deux variables typé de classe:

class Boo { ... }; 

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

Maintenant, vous pouvez appeler une fonction membre de Boo sur b0, mais seulement const fonctions membres sur b1 qualifiés pour un.

Questions connexes