¿Qué significa exactamente la palabra clave const
en C++ cuando está escrita al final de una función miembro (después de la lista de argumentos)?¿Cuál es el significado de un const al final de una función miembro?
Respuesta
Significa que *this
es const
dentro de esa función de miembro, es decir, no altera el objeto.
La palabra clave
this
es una expresión prvalue cuyo valor es la dirección del objeto para el que se llama a la función. El tipo dethis
en una función miembro de una claseX
es . Si la función de miembro se declaraconst
, el tipo dethis
esconst X*
. [sección 9.3.2 §1]En una función de miembro
const
, se accede al objeto para el que se llama a la función a través de una ruta de accesoconst
; por lo tanto, una función de miembroconst
no modificará el objeto y sus miembros de datos no estáticos. [Sección 9.3.2 § 2]
Esto significa que una función const
miembro puede ser llamado en una instancia const
de la clase. No se puede llamar a una función de miembro que no sea const
en [1] un objeto const
, ya que podría intentar modificarlo.
[de 1] Nota: un temporal no es un objeto const
a menos que sea de tipo const
.
optimizaciones del compilador son posibles, pero el beneficio principal es hacer cumplir el contrato expresado en la declaración de la función - si se define una función miembro como const
, el compilador impide cualquier modificación del objeto dentro de esa función.
Puede anular los campos individuales de la clase de esta restricción utilizando mutable
en su declaración. Esto es útil, por ejemplo, cuando tiene una clase que encapsula su propio lock_guard, que debe cambiar su valor para aplicar la seguridad del hilo incluso dentro de las funciones de miembro const
.
const
al final de una firma de función significa que la función debe suponer que el objeto del que es miembro es const
. En términos prácticos, significa que debe preguntar al compilador , verifique que la función miembro no cambia los datos del objeto de ninguna manera. Significa pedirle al compilador que compruebe que no cambia directamente ningún dato miembro, y no llama a ninguna función que no garantice que no cambiará el objeto.
Cuando crea un objeto const
le pide al compilador que se asegure de que ese objeto no cambie más allá de su inicialización. Eso a su vez significa que el compilador comprobará que no cambia directamente sus datos de miembro y que no llama a ninguna función que no garantice que no cambiará el objeto.
Esto es parte de la const correctness philosophy. En esencia, significa que si las cosas funcionan en este momento y no cambiarán, entonces nunca se romperán. En otras palabras, las cosas constantes son más fáciles de trabajar con fiabilidad. Esta cosa de const
al final de las firmas de funciones es una herramienta para prohibir que las cosas se rompan.Esto a su vez significa que debe poner const
en cualquier lugar que pueda.
gracias por esta explicación. ¿Hay algún argumento en contra de usar const en una función que no cambia el objeto? Siento que el software puede ser menos flexible de mantener si de repente decide, por ejemplo, cambiar un diseño y necesita llamar a una función no const en una función actualmente declarada y entonces tal vez una gran cadena de funciones que llaman a esta función debe ser cambiada también – Mat
No, no hay argumento en contra de usar un 'const'. Es decir, a menos que sepa ahora mismo, en el momento de diseñar su clase, que una función miembro debería poder cambiar el objeto. Es una pregunta de diseño que debe hacerse al principio, y debería ser fácil de responder. No se trata de "dejar la puerta abierta para más adelante". Más bien, se trata de si la función ** debe ** cambiar el objeto o ** no debe ** cambiarlo. Es una pregunta de sí/no, en blanco o negro, sin nada en el medio, y debería ser fácil de responder. Nota: no se trata de ** may ** puede cambiar el objeto, pero ** debe ** it. – wilhelmtell
Esto, a su vez, significa que la filosofía de corrección de constumbres te obliga a ser muy consciente de lo que hace cada función. Te obliga a decidir y ser muy claro sobre la razón de ser de cada una de las funciones de los miembros. Eso es bueno. Lo que estás preguntando es dejar una puerta abierta para cambiar la razón de ser de una función, y eso es algo malo. Solo debe cambiar ** cómo ** una función obtiene lo que debe hacer, no ** lo que ** hace. Piensa en los usuarios de tu API (que serás tú mismo). No tirar de la alfombra de sus pies! – wilhelmtell
- 1. ¿Cuál es la diferencia entre una función de miembro const y una función de miembro no const?
- 2. ¿Cuál es la semántica de una función miembro miembro?
- 3. Asignación de miembro en una función const
- 4. ¿Cuál es el significado de "bool operador() const"
- 5. ¿Cuál es el significado de este typedef?
- 6. ¿Cuál es el significado de "()" en una llamada a función?
- 7. Llamar a una función de miembro no const desde una función de miembro constante
- 8. C++ función de miembro const que devuelve un puntero const .. Pero, ¿qué tipo de const es el puntero devuelto?
- 9. ¿Cuál es el significado de ∃?
- 10. C++: Significado de const char * const *
- 11. ¿Cuál es el significado de []
- 12. ¿Cuál es el significado de una función sin un argumento "propio" en una clase?
- 13. ¿Cuál es el significado de esta sintaxis?
- 14. ¿Cuál es el significado del término "función libre" en C++?
- 15. ¿Cuál es el significado de '_' en python?
- 16. ¿Qué significa "const" (en contexto) al final de una definición de función?
- 17. ¿Puede la función de miembro de miembro devolver un puntero no const a un miembro de datos?
- 18. ¿Cuál es el uso de la sobrecarga const en C++?
- 19. ¿Cuál es el significado de id?
- 20. ¿Cuál es el significado de "unidad Hero"?
- 21. ¿Cuál es el significado de ORM?
- 22. ¿Cuál es el significado SQL de 0x5E5B7D7E?
- 23. ¿Cuál es el significado de CTOR?
- 24. ¿Cuál es el significado de 'sourceSets.all *'
- 25. ¿Cuál es el significado de android.location.LocationManager.PASSIVE_PROVIDER?
- 26. ¿Cuál es el significado de view.bounds.origin?
- 27. ¿Cuál es el significado de ".. ::." Cª#?
- 28. ¿Cuál es el significado de svg: svg?
- 29. ¿Cuál es el significado de erb?
- 30. ¿Cuál es el significado de $$ en Ruby?
ah ok thx! y ¿cómo puedo acceder a una función const como un puntero a una variable miembro? si intento 'int * ptr = & m_value' obtengo un' C2440 const int * no se puede convertir a int * ' – Mat
y ayuda esto al compilador a optimizar el código ensamblador o cuál es exactamente el beneficio? – Mat
@Mat: declare también su variable como una constante: 'const int * ptr = & m_value' –