2012-01-03 13 views
58

Estaba leyendo mi libro en C++ (Deitel) cuando me encontré con una función para calcular el volumen de un cubo. El código es el siguiente:¿No es redundante "const" cuando se pasa por valor?

double cube (const double side){ 
    return side * side * side; 
} 

La explicación para el uso del calificativo "const" era la siguiente: "El const calificado debe ser utilizado para hacer cumplir el principio de privilegio mínimo, diciéndole al compilador que la función no modifica lado variable ".

Mi pregunta: ¿no es el uso de "const" redundante/innecesario aquí ya que la variable se pasa por valor, por lo que la función no puede modificarlo de todos modos?

+5

El significado de 'const' aquí es que no se puede modificar el parámetro' side' dentro de cubo método '() para evitar un comportamiento inesperado. –

+1

a veces las cosas se refieren más a una "buena práctica" que a una necesidad. Creo que este es uno de esos momentos. – destan

+2

Creo que las respuestas hicieron un buen trabajo al explicar por qué lo harías, pero solo agregaré eso a un llamante externo, el 'const' * es * redundante y no es parte de la firma de la función. Eso significa que puede dejarlo apagado en la declaración de la función sin cambiar nada. También puede eliminarlo más tarde si por alguna razón desea hacer que su código sea menos sostenible, y no afectará el código de llamada. –

Respuesta

82

El calificador const impide que el código dentro de la función modifique el parámetro en sí. Cuando una función es más grande que un tamaño trivial, dicha seguridad le ayuda a leer y comprender rápidamente una función. Si sabes que el valor de side no cambiará, entonces no tienes que preocuparte por mantener un registro de su valor a medida que lees. En algunas circunstancias, esto incluso podría ayudar al compilador a generar un mejor código.

Una cantidad no trivial de personas hace esto por rutina, teniendo en cuenta que en general es un buen estilo.

+0

Tiene sentido. Gracias. –

+5

¿Por qué "también"? Eso es * todo * lo hace. –

+0

@KeithThompson - de hecho, eso es todo lo que hace, pero el O.P. está pensando en los parámetros de const ref, donde el 'const' le impide cambiar el objeto original. –

43

se puede hacer algo como esto:

int f(int x) 
{ 
    x = 3; //with "const int x" it would be forbidden 

    // now x doesn't have initial value 
    // which can be misleading in big functions 

} 
+10

+1 para ilustrar :) –

Cuestiones relacionadas