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?
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?
Respuestas:
Cuando aplica el const
calificador a una función miembro no estática, afecta al this
puntero. Para una función miembro de clase calificada const C
, el this
puntero es de tipo C const*
, mientras que para una función miembro que no está calificada const, el this
puntero es de tipo C*
.
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.
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 de static
, que depende del contexto.
C const*
o const 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 de this
. En cierto modo, es estrecho. Se puede ampliar aplicando esto const
más allá del this
puntero.
es decir, el "propuesto" const
, que también puede aplicarse a static
funciones, restringirá a los static
miembros de cualquier modificación.
En el código de ejemplo, si foo()
se puede hacer const
, 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!
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 al this
puntero implícito . Dado que un método de miembro estático no está vinculado a un objeto, no hay ningún this
puntero para hacer const
.
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.
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
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.
const
significaría para usted una función miembro estática?