En el siguiente C++
programa, la modificación de un miembro de datos estáticos de una const
funció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 const
función no funciona:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
¿Por qué una const
función de miembro puede modificar un static
miembro de datos?
const
significa que una función miembro de un objeto no puede modificar ese objeto . Puede modificar otros objetos de la misma clase, ostatic
datos, que están asociados con la clase, no una instancia particular de ella. (Omutable
miembros 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
const
calificador en una función miembro significa que no puede modificar variables miembro quemutable
no sean destatic
clase.Para ofrecer alguna racionalización, el
this
puntero en unaconst
función miembro calificada es unconst
tipo ythis
está inherentemente relacionado con una instancia de una clase.static
los miembros no están relacionados con una instancia de clase. No necesitas una instancia para modificar unstatic
miembro: 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 dethis
esconst A*
.fuente
this
puntero, sería de tipoconst A* const
inconst
.this
es 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
a
no es un subobjeto de un objeto del tipo de clase y el punterothis
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 constantethis
para modificar el miembro de datos. Y el puntero que es de hecho tiene tipoconst A *
dentro de la funciónset
porque 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
A
esconst
, entonces el tipo dethis
esconst X*
y, por lo tanto, evita que se modifiquen los miembros de datos no estáticos (cf, por ejemplo, el estándar C ++ ):Si
a
es un miembro de datos no estático, entoncesa=10
es el mismo quethis->a = 10
, que no está permitido si el tipo dethis
esconst A*
ya
no se ha declarado comomutable
. Así, dado quevoid set() const
hace el tipo dethis
serconst A*
, este acceso no está permitido.Si
a
es un miembro de datos estáticos, por el contrario,a=10
no implicathis
en absoluto; y siempre questatic int a
no se haya declarado por sí mismo comoconst
,a=10
se permite la declaración .fuente
El
const
calificador en una función miembro de medios que no se puede modificarnon-mutable
,non-static
miembros de datos de clase .fuente