¿No es “const” redundante al pasar por valor? [duplicate]

3 minutos de lectura

avatar de usuario
daniel scoco

Estaba leyendo mi libro de C++ (Deitel) cuando encontré una función para calcular el volumen de un cubo. El código es el siguiente:

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

La explicación para usar el calificador “const” fue esta: “El calificador const debe usarse para hacer cumplir el principio de privilegio mínimo, diciéndole al compilador que la función no modifica el lado de la 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 modificarla de todos modos?

  • El significado de const aquí es que no se puede modificar side parámetro dentro cube() método para evitar comportamientos inesperados.

    – Tomasz Nurkiewicz

    3 de enero de 2012 a las 15:09

  • a veces las cosas se tratan más de ‘buenas prácticas’ que de necesidad. Creo que este es uno de esos momentos.

    – destan

    3 de enero de 2012 a las 15:11

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

    –Matthew Crumley

    3 de enero de 2012 a las 16:37

  • Una cosa que no me gusta es que me obliga a (a) hacer el const visible en la declaración, donde no tiene sentido, o (b) hacer que la declaración y la definición sean inconsistentes. Supongo que la solución es superar mis dudas sobre (b).

    –Keith Thompson

    3 de enero de 2012 a las 18:15

  • En Java, el final Se requiere una palabra clave en la misma ubicación para que los cierres funcionen correctamente al declarar una clase anónima dentro de la función. ¿Podría ser lo mismo para C++?

    – Izkatá

    3 de enero de 2012 a las 20:33

avatar de usuario
Ernest Friedman-Hill

los const El calificador evita 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, tal seguridad lo ayuda a leer y comprender rápidamente una función. Si sabes que el valor de side no cambiará, entonces no tiene que preocuparse por mantener un registro de su valor a lo largo del tiempo mientras lee. En algunas circunstancias, esto podría incluso ayudar al compilador a generar un mejor código.

Un número no trivial de personas hace esto como una cuestión de rutina, considerándolo generalmente de buen estilo.

  • ¿Por qué “también”? Ese es todos lo hace.

    –Keith Thompson

    3 de enero de 2012 a las 18:12

  • @KeithThompson: de hecho, eso es todo lo que hace, pero el OP está pensando en los parámetros de referencia constante, donde el const le impide cambiar el objeto original.

    – Ernest Friedman-Hill

    3 de enero de 2012 a las 18:49

  • “Bajo algunas circunstancias, esto podría incluso ayudar al compilador a generar un mejor código”. Cita necesaria.

    – Farap

    15/07/2018 a las 18:45

  • Sigo pensando que es redundante. Si lo encuentra útil en funciones grandes, entonces hay algo mal con sus funciones, no con sus parámetros.

    – Trampa

    2 de febrero a las 16:20

avatar de usuario
psur

Puedes 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

}

  • @snakedoctor Gente mala. La gente mala lo hace. 🙂

    – Ernest Friedman-Hill

    04/04/2019 a las 19:30

  • No relacionado con la pregunta del OP.

    – lukasl1991

    17 de mayo de 2019 a las 7:08

¿Ha sido útil esta solución?