En el siguiente C++programa, la modificación de un miembro de datos estáticos de una constfunción funciona bien:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
Pero modificar un miembro de datos no estático de una constfunción no funciona:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
¿Por qué una constfunción de miembro puede modificar un staticmiembro de datos?

constsignifica que una función miembro de un objeto no puede modificar ese objeto . Puede modificar otros objetos de la misma clase, ostaticdatos, que están asociados con la clase, no una instancia particular de ella. (Omutablemiembros de datos, que fueron creados para ser la excepción a esta regla)Respuestas:
Es la regla, eso es todo. Y por una buena razón.
El
constcalificador en una función miembro significa que no puede modificar variables miembro quemutableno sean destaticclase.Para ofrecer alguna racionalización, el
thispuntero en unaconstfunción miembro calificada es unconsttipo ythisestá inherentemente relacionado con una instancia de una clase.staticlos miembros no están relacionados con una instancia de clase. No necesitas una instancia para modificar unstaticmiembro: puedes hacerlo, en tu caso, escribiendoA::a = 10;.Entonces, en su primer caso, piense
a = 10;en una abreviatura deA::a = 10;y en el segundo caso, piense en ello como una abreviatura dethis->a = 10;, que no es compilable ya que el tipo dethisesconst A*.fuente
thispuntero, sería de tipoconst A* constinconst.thises un valor de tipo puntero. Los valores pr de tipos que no son de clase nunca están calificados por cv.Según el estándar C ++ (9.2.3.2 miembros de datos estáticos)
Y (9.2.2.1 El puntero this)
Y por fin (9.2.2 Funciones miembro no estáticas)
Así, en esta definición de clase
class A { public: static int a; void set() const { a = 10; } };el miembro de datos estáticos
ano es un subobjeto de un objeto del tipo de clase y el punterothisno 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
aes 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 constantethispara modificar el miembro de datos. Y el puntero que es de hecho tiene tipoconst A *dentro de la funciónsetporque la función se declara con el calificadorconst. Si la función no tiene el calificador en este caso, el miembro de datos podría cambiarse.fuente
El caso es que si una función miembro de una clase
Aesconst, entonces el tipo dethisesconst X*y, por lo tanto, evita que se modifiquen los miembros de datos no estáticos (cf, por ejemplo, el estándar C ++ ):Si
aes un miembro de datos no estático, entoncesa=10es el mismo quethis->a = 10, que no está permitido si el tipo dethisesconst A*yano se ha declarado comomutable. Así, dado quevoid set() consthace el tipo dethisserconst A*, este acceso no está permitido.Si
aes un miembro de datos estáticos, por el contrario,a=10no implicathisen absoluto; y siempre questatic int ano se haya declarado por sí mismo comoconst,a=10se permite la declaración .fuente
El
constcalificador en una función miembro de medios que no se puede modificarnon-mutable,non-staticmiembros de datos de clase .fuente