Según el estándar C ++ (9.2.3.2 miembros de datos estáticos)
1 Un miembro de datos estáticos no es parte de los subobjetos de una clase ...
Y (9.2.2.1 El puntero this)
1 En el cuerpo de una función miembro no estática (9.2.1), la palabra clave this es una expresión prvalue cuyo valor es la dirección del objeto para el que se llama a la función. El tipo de esto en una función miembro de una clase X es X *. Si la función miembro se declara const, el tipo de esto es const X * , ...
Y por fin (9.2.2 Funciones miembro no estáticas)
3 ... si la búsqueda de nombre (3.4) resuelve el nombre en la expresión id en un miembro no tipo no estático de alguna clase C, y si la expresión id se evalúa potencialmente o C es X o una clase base de X, la expresión-id se transforma en una expresión de acceso de miembro de clase (5.2.5) usando (* this) (9.2.2.1) como la expresión-sufijo a la izquierda de. operador.
Así, en esta definición de clase
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
el miembro de datos estáticos a
no es un subobjeto de un objeto del tipo de clase y el puntero this
no se utiliza para acceder al miembro de datos estáticos. Entonces, cualquier función miembro, constante no estática o no constante, o una función miembro estática puede cambiar el miembro de datos porque no es una constante.
En esta definición de clase
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
el miembro de datos no estáticos a
es un subobjeto de un objeto del tipo de clase. Para acceder a él en una función de miembro, se utiliza una sintaxis de acceso de miembro de esta sintaxis. No puede utilizar un puntero constante this
para modificar el miembro de datos. Y el puntero que es de hecho tiene tipo const A *
dentro de la función set
porque la función se declara con el calificador const
. Si la función no tiene el calificador en este caso, el miembro de datos podría cambiarse.