Hoy tengo un problema. Necesito una static
función de miembro, const
no es imprescindible, sino mejor. Pero no tuve éxito en mis esfuerzos. ¿Alguien puede decir por qué o cómo?
c++
static
language-lawyer
const-method
prabhakaran
fuente
fuente
const
significaría para usted una función miembro estática?Respuestas:
Cuando aplica el
const
calificador a una función miembro no estática, afecta althis
puntero. Para una función miembro de clase calificada constC
, elthis
puntero es de tipoC const*
, mientras que para una función miembro que no está calificada const, elthis
puntero es de tipoC*
.Una función miembro estática no tiene
this
puntero (dicha función no se llama en una instancia particular de una clase), por lo que la calificación constante de una función miembro estática no tiene ningún sentido.fuente
const
tendría que ser el mismo para un miembro estático que para uno no estático. Como ejemplo de que ese pensamiento no se sostiene, considere el significado destatic
, que depende del contexto.C const*
oconst C*
?Estoy de acuerdo con tu pregunta, pero desafortunadamente C ++ está diseñado de esa manera. Por ejemplo:
class A { int i; //<--- accessed with 'this' static int s; //<---- accessed without 'this' public: static void foo () const // <-- imaginary const {} };
A día de hoy,
const
se considera en el contexto dethis
. En cierto modo, es estrecho. Se puede ampliar aplicando estoconst
más allá delthis
puntero.es decir, el "propuesto"
const
, que también puede aplicarse astatic
funciones, restringirá a losstatic
miembros de cualquier modificación.En el código de ejemplo, si
foo()
se puede hacerconst
, entonces en esa función,A::s
no se puede modificar. No puedo ver ningún efecto secundario del idioma, si esta regla se agrega al estándar. Por el contrario, ¡es divertido que no exista tal regla!fuente
const
se aplica a un objeto (en el caso de las funciones miembro const, la instancia en la que se llama). Si desea que se aplique a todos los miembros estáticos de la clase, supongo que si el comité lo consideró en absoluto, no se pensó que fuera un requisito lo suficientemente común como para ser compatible.const
modificador no se aplica a métodos de miembro o variables de miembro, sino althis
puntero implícito . Dado que un método de miembro estático no está vinculado a un objeto, no hay ningúnthis
puntero para hacerconst
.Sin entrar en detalles, es porque puede haber o no un objeto modificado por la función, por lo que const es ambiguo para el compilador.
Recuerde que
const
mantiene los objetos constantes, pero puede que haya o no un objeto aquí para mantener constante.fuente
this
puntero. (Además de lo cual,const
no mantiene los objetos constantes. Evita que un puntero o referencia en particular se use para modificar el objeto, pero la modificación aún podría ocurrir a través de otra ruta)Es lamentable que C ++ no lo acepte según el diseño, pero lógicamente hay pocos casos de uso en los que se valida bien.
Una función que es válida a nivel de clase (estática) podría no cambiar ningún dato estático, puede ser que solo los datos de consulta sean constantes. Tal vez debería ser como
if(Object) MakeThisConstant() else MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
fuente
Una 'función miembro const' no puede modificar el objeto al que se llama, pero las funciones miembro estáticas no se llaman en ningún objeto. Es utilizado directamente por el operador de resolución de alcance. Por lo tanto, tener una función miembro estática constante no tiene sentido, por lo que es ilegal.
fuente