2012-05-23 6 views
6

Estoy luchando para entender las diferencias entre los distintos lugares donde puede poner 'const' en una declaración de función en C++.C++ Diferencia entre const posicionamiento

¿Cuál es la diferencia entre const al principio:

const int MyClass::showName(string id){ 
... 
} 

Y const al final como:

int MyClass::showName(string id) const{ 
... 
} 

Además, ¿cuál es el resultado de tener const tanto al inicio y al al final de esta manera:

const int MyClass::showName(string id) const{ 
... 
} 
+0

pregunta relacionada [aquí] (http://stackoverflow.com/questions/10368294/const-at-the-end-of-function-declaration-in-c/) – juanchopanza

Respuesta

18

const int MyClass::showName(string id) devuelve un objeto const int. Entonces, el código de llamada no puede cambiar la int devuelta. Si el código de llamada es como const int a = m.showName("id"); a = 10;, se marcará como un error del compilador. Sin embargo, según lo observado por @David Heffernan a continuación, dado que el número entero es devuelto por copia, el código de llamada no está obligado a usar const int. Puede muy bien declarar int como el tipo de devolución y modificarlo. Como el objeto se devuelve mediante copia, no tiene mucho sentido declarar el tipo de devolución como const int.

int MyClass::showName(string id) const indica que el método showName es una función de miembro const. Una función de miembro const es la que no modifica ninguna variable miembro de la clase (a menos que estén marcadas como mutable). Entonces, si tiene la variable miembro int m_a en la clase MyClass y si intenta hacer m_a = 10; dentro de showName, obtendrá un error de compilación.

El tercero es la combinación de los dos casos anteriores.

+0

Muchas gracias por su explicación :) ¡Lo entiendo ahora! – user1055650

+3

El primer párrafo no da en el blanco. Un valor de retorno constante no lo obliga a declarar su variable a la que se le asigna el valor de retorno como const. También puede escribir 'int a = m.showName (..);'. Y luego puedes felizmente modificar 'a'. –

10
  1. T El const adjunto al valor de retorno se aplica al valor de retorno. Dado que el valor de retorno se copia, es una declaración inútil y no importa si lo incluye o no.
  2. El const después de la lista de parámetros significa que la función no modifica ningún estado del objeto que no está marcado como mutable. Esta es una función de miembro constante y si tiene un objeto const, el compilador no le permitirá llamar a las funciones miembro non-const en un objeto const.

no hay interacción entre estos dos usos de const - que son completamente constructos independientes

+0

Gracias, he estado tratando de conseguir mi cabeza alrededor por un tiempo ahora! – user1055650

4

La diferencia es que el const se aplica a cosas diferentes.

Esto dice que showName devuelve un valor constante int - uno que es inmutable. Por supuesto, desde el int se devuelve por valor la presencia de const aquí no juega ningún papel.

const int MyClass::showName(string id) 

Y esto dice que showName no modifica el estado observable de MyClass (técnicamente: no modifica cualquier miembro que no se declara mutable), y por lo tanto se le permite llamar en un valor de tipo const MyClass .

int MyClass::showName(string id) const 

Si utiliza ambos const s entonces tanto de las circunstancias anteriores.

0

Preguntas como esta tienden a fortalecer mi resolución de seguir los consejos de Dan Saks como se describe en este artículo "Conversaciones con un gurú": http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835.

En particular, se trata de cómo la ubicación de la const cambia las cosas. (*) Me doy cuenta de que es muy poco probable que convierta a alguien de escribir const int ... a int const ..., pero dicho esto, hay una razón por la que prefiero hacer esto último.

(*) incluyendo una nota que indica que el cambio no tiene ningún efecto al cambiar la const con la declaración de tipo desde el principio.

Se convierte en muy fácil lectura, porque para cualquier instancia de la palabra const en una declaración, todo a la izquierda de la misma es el tipo de lo que es constante, y todo a la derecha es lo que realmente es const.

Considérese una declaración como:

int const * * const pointerToPointer; 

Los primeros estados const que los números enteros al final de la cadena de puntero const son, y deben ser encontrados en * * const pointerToPointer. Mientras tanto, el segundo indica que un objeto de tipo puntero a puntero para const int también es const y que este objeto es pointerToPointer.

En el caso de la OP:

int const MyClass::showName(string id){ 
... 
} 

El tipo de lo que es const int es, y lo que es const es el valor de retorno de la función.

Mientras tanto:

int MyClass::showName(string id) const { 
... 
} 

Aquí el tipo de lo que es const es la función (string) int regresar, y lo que es const es la función en sí, es decir, el cuerpo de la función.

Cuestiones relacionadas