c++ - remix - smart contracts ethereum
¿Cuál es el significado de una función al final de una función miembro? (3)
Esta pregunta ya tiene una respuesta aquí:
¿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)?
Las optimizaciones del compilador son posibles, pero la principal ventaja es hacer cumplir el contrato expresado en la declaración de la función: si define una función miembro como const
, el compilador impide cualquier modificación al objeto dentro de esa función.
Puede eximir campos individuales en la clase de esta restricción usando 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 imponer la seguridad del hilo incluso dentro de las funciones de los miembros de la const
.
Significa que *this
es const
dentro de esa función miembro, es decir, no altera el objeto.
La palabra clave es una expresión prvalue cuyo valor es la dirección del objeto para el que se llama a la función. El tipo de
this
en una función miembro de una claseX
esX*
. Si la función miembro se declaraconst
, el tipo dethis
esconst X*
. [sección 9.3.2 §1]En una función
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 miembro miembro no modificará el objeto y sus miembros de datos no estáticos. [sección 9.3.2 §2]
Esto significa que se puede llamar a una función miembro miembro en una instancia const
de la clase. No se puede const
función de miembro no const
en [1] un objeto const
, ya que podría intentar modificarlo.
[1] Nota: un temporal no es un objeto const
menos que sea de tipo 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 le pide al compilador que verifique que la función miembro no modifique los datos del objeto de ninguna manera. Significa pedirle al compilador que verifique 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.
Todo esto es parte de la filosofía de const correctness . 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 característica al final de las firmas de funciones es una herramienta para que prohíba que las cosas se rompan. Esto a su vez significa que debes poner const
donde sea que puedas.