Question Que signifie "const" à la déclaration de fin de fonction? [dupliquer]


Dupliquer possible:
Signification de "const" dernier dans une déclaration de méthode C ++? 

salut J'ai un livre où il y a quelque chose comme:

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

En outre, une question récurrente: pourquoi devrais-je / ne devrais-je pas utiliser const avant les déclarations d'argument? Qu'est-ce que ça change?

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

MODIFIER: Donc si je le fais maintenant:

Foo v1, v2;

La fonction Barre (const-tagged) existera-t-elle 3 fois ou 1 fois en mémoire?


415
2018-06-29 13:31


origine


Réponses:


Une "fonction const", indiquée par le mot-clé const après une déclaration de fonction, fait une erreur de compilation pour cette fonction de classe pour 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 considérer une fonction de classe comme une fonction normale prenant une this aiguille. Donc une méthode int Foo::Bar(int random_arg) (sans le const à la fin) se traduit par une fonction comme int Foo_Bar(Foo* this, int random_arg)et un appel tel que Foo f; f.Bar(4) va correspondre intérieurement à quelque chose comme Foo f; Foo_Bar(&f, 4). Ajouter 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). Depuis 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 avec le mot clé mutable. Ainsi, si une variable de classe est marquée comme mutable et qu'une "fonction const" écrit sur cette variable, le code sera compilé proprement et la variable pourra être modifiée. (C ++ 11)

Comme d'habitude quand il s'agit de const mot-clé, changer l'emplacement du mot clé const dans une instruction C ++ a des significations entièrement différentes. L'utilisation ci-dessus de const ne s'applique que lors de l'ajout const à la fin de la déclaration de fonction après la parenthèse. const est un qualificatif fortement surutilisé en C ++ et la syntaxe et l'ordre n'est souvent pas simple en combinaison avec des pointeurs. Quelques lectures sur const l'exactitude et la const mot-clé:

Constance correcte

La déclaration C ++ 'const': pourquoi et comment


724
2018-06-29 13:32



Considérez deux variables typées de classe:

class Boo { ... };

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

Vous êtes maintenant en mesure d'appeler tout fonction membre de Boo sur b0, mais, seulement constfonctions de membre qualifiées sur b1.


32
2018-06-29 13:36



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


11
2018-06-29 13:34



Semblable à ce question.

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


8
2018-06-29 13:33



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


7
2018-06-29 13:35



Fonction ne peut pas changer ses paramètres via le pointeur / référence que vous lui avez donné.

Je vais sur cette page chaque fois que j'ai besoin d'y penser:

http://www.parashift.com/c++-faq-lite/const-correctness.html

Je crois qu'il y a aussi un bon chapitre dans "More Effective C ++" de Meyers.


7
2018-06-29 15:09