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?
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;
};
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).
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
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.
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.
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.
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