web-dev-qa-db-fra.com

const avant paramètre vs const après nom de la fonction c ++

Quelle est la différence entre quelque chose comme ça

friend Circle copy(const Circle &);

et quelque chose comme ça

friend Circle copy(Circle&) const;

Je sais que const après que la fonction est utilisée pour dire au compilateur que cette fonction ne tentera pas de changer l'objet sur lequel elle est appelée, qu'en est-il de l'autre?

61
jazzybazz

La première forme signifie que l’objet (état de) Circle lié à la référence qui est le paramètre de la fonction copy() ne sera pas modifié par copy() à travers cette référence. La référence est une référence à const, il ne sera donc pas possible d'invoquer les fonctions membres de Circle à travers cette référence qui ne sont pas elles-mêmes qualifiées de const.

Le second formulaire, en revanche, est illégal: seul fonctions membres peut être qualifié const- (pendant que vous déclarez qu'il existe une fonction globale, friend ).

Lorsque const qualifie une fonction membre, la qualification fait référence à l'argument implicite this. En d’autres termes, cette fonction ne sera pas autorisée à modifier l’état de l’objet sur lequel elle est invoquée (l’objet pointé par le pointeur implicite this,), à l’exception des objets mutable, mais c'est une autre histoire.

Pour le dire avec le code:

struct X
{
    void foo() const // <== The implicit "this" pointer is const-qualified!
    {
        _x = 42; // ERROR! The "this" pointer is implicitly const
        _y = 42; // OK (_y is mutable)
    }

    void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
    {
        obj._x = 42; // OK! obj is a reference to non-const
        _x = 42; // ERROR! The "this" pointer is implicitly const
    }

    void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
    {
        obj._x = 42; // ERROR! obj is a reference to const
        obj._y = 42; // OK! obj is a reference to const, but _y is mutable
        _x = 42; // OK! The "this" pointer is implicitly non-const
    }

    int _x;
    mutable int _y;
};
154
Andy Prowl

Les méthodes de classe C++ ont un paramètre implicite this qui précède tous les explicites. Donc, une fonction déclarée dans une classe comme celle-ci:

class C {
  void f(int x);

Vous pouvez imaginer que ça ressemble vraiment à ça:

  void f(C* this, int x);

Maintenant, si vous le déclarez de cette façon:

  void f(int x) const;

C'est comme si vous écriviez ceci:

  void f(const C* this, int x);

C'est-à-dire que la fin const crée le paramètre this const, ce qui signifie que vous pouvez appeler la méthode sur des objets const du type classe et que celle-ci ne peut pas modifier l'objet sur lequel elle a été appelée. (du moins, pas via les canaux normaux).

50
John Zwinck
Circle copy(Circle&) const;

rend la fonction const elle-même. Ceci ne peut être utilisé que pour les fonctions membres d'une classe/structure.

Faire une fonction membre const signifie que

  • il ne peut appeler aucune fonction membre non-const
  • il ne peut changer aucune variable membre.
  • il peut être appelé par un objet const (const les objets ne peuvent appeler que const fonctions). Les objets non const peuvent également appeler une fonction const.

Celui-ci doit être une fonction membre de la classe 'Circle'.

Considérons maintenant le prochain:

Circle copy(const Circle &);

tandis que celui-ci signifie que le paramètre passé ne peut pas être changé dans la fonction. Celui-ci peut ou non être une fonction membre de la classe.

NOTE: Il est possible de surcharger une fonction de manière à avoir une version const et non-const de la même fonction.

6
Waqar Ahmed

L'un se réfère au paramètre l'autre à la fonction.

Circle copy(const Circle &);

Cela signifie que le paramètre transmis ne peut pas être modifié dans la fonction

Circle copy(Circle&) const;

La fonction qualifiée const est utilisée pour les fonctions membres et signifie que vous ne pouvez pas modifier les données membres de l'objet lui-même. L'exemple que vous avez posté était absurde.

Lire de droite à gauche

Si nous réécrivons la première fonction sous la forme Circle copy(Circle const&);, ce qui signifie la même chose, il devient clair que la lecture de droite à gauche devient utile. copy est une fonction qui prend une référence const à un objet Circle et renvoie un objet Circle par référence.

3
Alex Chamberlain

friend Circle copy(const Circle &); // fait référence au paramètre constant de la fonction. ne peut pas changer la valeur stockée par paramètre.

Vous devez supprimer un ami dans votre exemple La copie de cercle (Cercle &) const; // ne peut pas changer cette valeur de poniter nommée Fonction de membre constant

0
shivakumar