Dans le C++
programme suivant , la modification d'un membre de données statiques à partir d'une const
fonction fonctionne correctement:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
Mais la modification d'un membre de données non statique à partir d'une const
fonction ne fonctionne pas:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
Pourquoi une const
fonction membre peut-elle modifier un static
membre de données?
const
signifie qu'une fonction membre d'un objet ne peut pas modifier cet objet . Il peut modifier d'autres objets de la même classe, ou desstatic
données, qui sont associées à la classe, pas une instance particulière de celle-ci. (Oumutable
les membres de données, qui ont été créés pour être l'exception à cette règle.)Réponses:
C'est la règle, c'est tout. Et pour une bonne raison.
Le
const
qualificatif sur une fonction membre signifie que vous ne pouvez pas modifier les variables membres nonmutable
non-static
classe.Pour offrir une certaine rationalisation, le
this
pointeur dans uneconst
fonction membre qualifiée est unconst
type, etthis
est intrinsèquement lié à une instance d'une classe.static
les membres ne sont pas liés à une instance de classe. Vous n'avez pas besoin d'une instance pour modifier unstatic
membre: vous pouvez le faire, dans votre cas, en écrivantA::a = 10;
.Donc, dans votre premier cas, pensez
a = 10;
à un raccourci pourA::a = 10;
et dans le second cas, considérez-le comme un raccourci pourthis->a = 10;
, qui n'est pas compilable puisque le type dethis
estconst A*
.la source
this
pointeur, il serait de typeconst A* const
dansconst
le cas de.this
est une valeur de type pointeur. Les valeurs prvalues des types non-classe ne sont jamais qualifiées cv.Selon la norme C ++ (9.2.3.2 membres de données statiques)
Et (9.2.2.1 Le pointeur this)
Et enfin (9.2.2 Fonctions membres non statiques)
Ainsi dans cette définition de classe
class A { public: static int a; void set() const { a = 10; } };
le membre de données statiques
a
n'est pas un sous-objet d'un objet du type de classe et le pointeurthis
n'est pas utilisé pour accéder au membre de données statiques. Ainsi, toute fonction membre, constante non statique ou non constante, ou une fonction membre statique peut changer le membre de données car ce n'est pas une constante.Dans cette définition de classe
class A { public: int a; void set() const { a = 10; } };
le membre de données non statique
a
est un sous-objet d'un objet de type classe. Pour y accéder dans une fonction membre, on utilise soit une syntaxe d'accès aux membres de cette syntaxe est implicite. Vous ne pouvez pas utiliser un pointeur constantthis
pour modifier le membre de données. Et le pointeur dont il s'agit a en effet du typeconst A *
dans la fonctionset
car la fonction est déclarée avec le qualificatifconst
. Si la fonction n'avait pas de qualificatif dans ce cas, le membre de données pourrait être modifié.la source
Le fait est que si une fonction membre d'une classe
A
estconst
, alors le type dethis
estconst X*
, et empêche ainsi les membres de données non statiques d'être modifiés (cf., par exemple, le standard C ++ ):Si
a
est un membre de données non statique, alorsa=10
est identique àthis->a = 10
, ce qui n'est pas autorisé si le type dethis
estconst A*
eta
n'a pas été déclaré commemutable
. Ainsi, puisquevoid set() const
fait le type d'this
êtreconst A*
, cet accès n'est pas autorisé.Si
a
est un membre de données statique, en revanche,a=10
n'implique pasthis
du tout; et tant questatic int a
par lui-même n'a pas été déclaré commeconst
, la déclarationa=10
est autorisée.la source
Le
const
qualificatif sur une fonction membre des moyens que vous ne pouvez pas modifiernon-mutable
, lesnon-static
membres de données de classe .la source