una tipos que programacion matematicas declara constantes constante como c++ c const keyword

c++ - tipos - ¿Por qué usarías la palabra clave const si ya sabes que la variable debería ser constante?



tipos de constantes en programacion (11)

Además de especificar a los lectores del código que puede causar errores si modifica esta variable (puede usar comentarios para hacer esto)

No "puede"; causará errores en su programa.

  • Un compilador de C ++ lo hará cumplir con fallas de compilación y mensajes de diagnóstico ("errores de compilación"), sin necesidad de comentarios;
  • El compilador de CA lo aplicará en su mayor parte , aunque su biblioteca estándar tiene agujeros gracias al legado, como strchr , y tiene algunas reglas de conversión implícitas más bien indulgentes que pueden permitirle abandonar la const sin darse cuenta con bastante facilidad. Sin embargo, solo porque haya obtenido una compilación exitosa no significa que no tenga errores; desafortunadamente, significa que los errores pueden ser errores sutiles en su programa, así como fallas grandes y espectaculares.

De cualquier manera, se garantiza que su programa contiene un error dentro de él.

Me parece que si no quieres que se modifique una variable, simplemente no lo hagas.

Bueno, eso está muy bien, pero nadie es perfecto. Los programadores cometen errores. Esto le permite al compilador, que nunca comete errores (al menos no habitualmente), señalarlos a usted.

Es de uso particular cuando usa variables de datos con muchas, muchas líneas de código lejos de donde se creó. Cuanto más lejos está, más fácil es modificarlo sin darse cuenta de que se suponía que no debía hacerlo. Para bases de código grandes y complejas, es simplemente una necesidad.

Obtienes una nueva medida de capacidad de prueba , corrección y estabilidad en tu código base, así como una gran cantidad de posibles causas de errores muy sutiles y desagradables. También existen grandes oportunidades de optimización para su compilador (en algunos casos) cuando sabe que algún valor no cambiará después de la compilación.

Podríamos enumerar las ventajas todo el día pero, en realidad, no lo asimilará por completo hasta que haya trabajado en una base de código semejante.

De hecho, en un mundo perfecto, todas las variables serían const por defecto , y tendría que declararlas con la palabra clave mutable para poder cambiarlas. C ++ está al revés.

Muchos de los libros que estoy leyendo usan palabras clave const cuando el valor de una variable no debe modificarse. Además de especificar a los lectores del código que puede causar errores si modifica esta variable (puede usar comentarios para hacer esto), ¿por qué necesitaría que esa palabra clave sea parte de cualquier lenguaje de programación? Me parece que si no quieres que se modifique una variable, simplemente no lo hagas.

¿Alguien podría aclarar esto por mí?


Además de las consideraciones de programación habituales ya discutidas en otras respuestas, una cosa que me preocupa es la actitud:

Me parece que si no quieres que se modifique una variable, simplemente no lo hagas.

Una regla general es que el 20% del costo de escribir el código se gasta en la fase de desarrollo. El otro 80% se gasta durante la vigencia del código actualizándolo, manteniéndolo, etc. Esto significa que muchas otras personas trabajarán en su código que no sea usted.

El tiempo invertido durante el desarrollo que evita problemas años después es una buena inversión. Este esfuerzo incluye: escribir comentarios; definir constantes que son constantes; y escribir código explícito que no se basa en construcciones de lenguaje oscuro.

Además, @worlboss, escucho una gran cantidad de intolerancia. Como han comentado otros, las unidades de carbono cometen errores y se agradece cualquier cosa que una unidad de silicio pueda hacer para evitar errores.


Al menos en C ++, const tiene algunos usos más allá de solo documentar su intención a otros programadores.

const también puede decirle al compilador algunas cosas. Por ejemplo, una función que toma una referencia, como: void f(T &t); no puede aceptar un objeto temporal como su parámetro. Para que lo haga, necesita const la referencia, como: void f(T const &t) .

Del mismo modo, para invocar una función miembro en un objeto const, la función miembro debe ser const calificada como: void T::foo() const {} .

En un sistema integrado, const puede significar aún más, posiblemente diciéndole al compilador dónde ubicar el objeto en cuestión (poniéndolo en ROM frente a RAM). const por sí mismo no es necesariamente suficiente dígale "poner este objeto en la ROM", pero a menudo es un requisito previo.

Del mismo modo (bajo C ++ 11) const le dice al compilador sobre la seguridad del hilo .

Ahora bien, es indudablemente cierto que podría definir algún otro idioma que (de otras maneras) se pareciera a C o C ++ que no usó const de estas maneras. El resultado sería un lenguaje bastante diferente de cualquiera. Sin conocer su intención, es imposible decir cómo resultaría, pero podría terminar más cerca de Java o C # (para un par de ejemplos), ambos de los cuales son algo similares a C y C ++ de alguna manera, pero no este particular uno (es decir, no use const como C y C ++ do).


Aquí hay un simple ejemplo de C:

void PrintList(const struct List *l); void SortList(struct List *l); int CmpList(const struct List *a, const struct List *b); void AppendList(struct List *l, struct List *m); void PushList(struct List *l, struct ListNode *n); void PopList(struct List *l, struct ListNode *n);

Aquí tenemos un pequeño conjunto de funciones que funcionan con algún tipo de lista de nodos. Primero, sin siquiera saber los nombres de las funciones, podemos ver de inmediato qué funciones cambian nuestra lista de alguna manera, y cuáles no. Las funciones const , como en las bibliotecas estándar, son aquellas que no modifican sus datos, y no le permitirán cambiar sus datos con ellas. El compilador de C intenta mantener la const -ness de los punteros aplicados a los datos que está pasando a las funciones. Entonces, en este caso, puedo estar razonablemente seguro de que comparar dos listas no es la función que las está destruyendo cuando hago mi depuración en tiempo de ejecución, ya que me he protegido contra modificaciones accidentales en mis datos. ;)


Considere el escenario donde está usando las mismas constantes muchas veces en todo su proyecto y está codificándolo en todos los lugares. Ahora, de repente, se requiere que cambie el valor de la constante a otro valor, por lo que será agitado hacer cambios en todas las ubicaciones.

Así que creo que hacer que tu código sea más fácil de mantener definitivamente es una de las razones.


Dos razones:

  1. documentación compilada
  2. optimizaciones del compilador

Aquí hay una buena explanation de Ian Lance Taylor (quien trabajó en el enlazador gcc y gold ):

El primer significado de const tiene un efecto real en el programa. Una variable declarada const se puede compilar de forma diferente a una variable que no se declara const.

El segundo significado de const, por otro lado, es, en efecto, la documentación forzada por el compilador. El compilador emitirá un error si se intenta cambiar un valor utilizando un puntero const calificada, pero declarar dicho puntero no cambiará el código generado.


Esta es una pregunta difícil porque IMO se basa en creencias. Una de esas creencias es que puedes proteger tu código contra algún tipo de cambio simplemente agregando más código. Por supuesto, ese código adicional es utilizado por el compilador para verificar que todo esté bien.

Creo que eso no siempre es correcto, no puedes proteger tu código contra ti o contra tu equipo de desarrollo simplemente agregando palabras clave, de hecho, hay muchos idiomas que no tienen const, public, private, protected, internal, int, float, palabras clave dobles y eso no significa que no sean buenos idiomas.

Lo mismo ocurre con algunos patrones de código, ¿por qué la gente pierde tanto tiempo discutiendo sobre Singletons? Si quieres tener solo una instancia, lo único que tienes que hacer es crear una sola instancia, eso es todo. La misma mentalidad está en todas partes, eche un vistazo a los artículos de programación defensiva publicados hace 10 años, una vez más la idea de proteger el código con código.

En algún momento, debe decidir dónde quiere establecer las responsabilidades, en manos de los desarrolladores o en las de los compiladores. Sin embargo, ni el compilador ni ninguna otra herramienta pueden guardar el código en contra de los desarrolladores y, por esa razón, muchas palabras clave son inútiles o simplemente una forma de comunicar algo a otros desarrolladores.


Las variables constantes solo le permiten escribir un código más legible.

El más utilizado para const en casi todos los idiomas es permitirnos usar nombres para referirse a valores de constantes, para que pueda decir a otros, usando un lenguaje fluido, a qué se refiere este nombre sin necesidad de difundir comentarios en su código y ahorrar tiempo y esfuerzo de los lectores para conocer el tipo de parámetros y las particularidades de los parámetros. Por supuesto, también se beneficia si su valor constante se reutiliza en su código. Bueno, un código como este puede ser más legible:

processPages(LETTER_PAPER_WIDTH, LETTER_PAPER_HEIGHT);

...que esto:

processPages(215.9, 279.4); // 8.5 x 11 Inches in millimeters for Letter Papers

En el ejemplo anterior, necesita comprender qué es cada parámetro, su unidad y el tipo para interpretar los valores, y aún necesita validarlo contra el comentario, porque un comentario redundante como este (esos comentarios que reproducen lo codificado) no es un comentario confiable y útil (es un comentario negativo según Robert Martin en Clean Code: http://goo.gl/5EyY ).


Le dice al compilador que la variable no se debe modificar, por lo que si alguien escribe el código que la modifica, el compilador la señala como un error.


Su compilador puede hacer grandes optimizaciones, sabiendo que una variable no se cambiará: en lugar de almacenarla en la memoria, se escribe directamente en el código de operación ejecutable.

ejemplo: tienes a y b, quieres agregarlos, haces a + b. Si declara que es const y de valor 3, el programa hará 3 + b en su lugar, lo que ahorrará memoria y ciclos porque no necesitará recuperar el valor a.

El problema es que su compilador no puede saber de antemano si las variables son constantes o no, por supuesto que podría analizar todo el código y verificar si usted modificó tales variables, pero no es 100% seguro, ya que el código futuro también puede modificarlo.


const palabras clave es muy útil para equipos y proyectos a largo plazo. Le daré algunos ejemplos, esos deberían explicar el valor de la palabra clave const .

Digamos ahora que estoy creando lib que se utilizará para otros proyectos. Por lo tanto, es necesario confiar en el código que se escribe hoy después de unos años, en un período de tiempo tal que probablemente olvidemos qué variable no se debe modificar (los colegas incluso no saben qué se puede modificar y qué no). Entonces, este breve ejemplo explica por qué usar const .

Hablando de comentarios, cuando se acerca la fecha límite y hay muchas cosas que todavía no funcionan, los comentarios sobre cada función serían solo una pérdida de tiempo. Sin embargo, en algunos casos, los comentarios son obligatorios, debido al primer problema (fecha límite) los comentarios pueden no leerse, porque la mayoría son inútiles, pero también se omiten los comentarios importantes. Por lo tanto, es mejor utilizar la palabra clave const que proporciona un error de compilación y lo señala en el problema, luego escribe y lee muchos comentarios.