Hoy tengo un problema. Necesito una staticfunción de miembro, constno 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

constsignificaría para usted una función miembro estática?Respuestas:
Cuando aplica el
constcalificador a una función miembro no estática, afecta althispuntero. Para una función miembro de clase calificada constC, elthispuntero es de tipoC const*, mientras que para una función miembro que no está calificada const, elthispuntero es de tipoC*.Una función miembro estática no tiene
thispuntero (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
consttendrí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,
constse considera en el contexto dethis. En cierto modo, es estrecho. Se puede ampliar aplicando estoconstmás allá delthispuntero.es decir, el "propuesto"
const, que también puede aplicarse astaticfunciones, restringirá a losstaticmiembros de cualquier modificación.En el código de ejemplo, si
foo()se puede hacerconst, entonces en esa función,A::sno 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
constse 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.constmodificador no se aplica a métodos de miembro o variables de miembro, sino althispuntero implícito . Dado que un método de miembro estático no está vinculado a un objeto, no hay ningúnthispuntero 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
constmantiene los objetos constantes, pero puede que haya o no un objeto aquí para mantener constante.fuente
thispuntero. (Además de lo cual,constno 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 scenariosfuente
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