Selon la norme C ++ (9.2.3.2 membres de données statiques)
1 Un membre de données statique ne fait pas partie des sous-objets d'une classe ...
Et (9.2.2.1 Le pointeur this)
1 Dans le corps d'une fonction membre non statique (9.2.1), le mot-clé this est une expression prvalue dont la valeur est l'adresse de l'objet pour lequel la fonction est appelée. Le type de ceci dans une fonction membre d'une classe X est X *. Si la fonction membre est déclarée const, le type de ceci est const X * , ...
Et enfin (9.2.2 Fonctions membres non statiques)
3 ... si la recherche de nom (3.4) résout le nom dans l'expression-id en un membre non-statique non-type d'une classe C, et si soit l'expression-id est potentiellement évaluée, soit C est X ou une classe de base de X, l'expression id est transformée en une expression d'accès de membre de classe (5.2.5) en utilisant (* this) (9.2.2.1) comme expression de suffixe à gauche de. opérateur.
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 pointeur this
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 constant this
pour modifier le membre de données. Et le pointeur dont il s'agit a en effet du type const A *
dans la fonction set
car la fonction est déclarée avec le qualificatif const
. Si la fonction n'avait pas de qualificatif dans ce cas, le membre de données pourrait être modifié.