2010-10-30 17 views

Respuesta

61

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 de this en una función miembro de una clase X es . Si la función de miembro se declara const, el tipo de this es const 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 acceso const; por lo tanto, una función de miembro const 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.

+0

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

+0

y ayuda esto al compilador a optimizar el código ensamblador o cuál es exactamente el beneficio? – Mat

+2

@Mat: declare también su variable como una constante: 'const int * ptr = & m_value' –

10

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.

25

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.

+0

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

+1

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

+1

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

Cuestiones relacionadas