Una de las cosas más complicadas de un lenguaje de programación es aprender los diferentes usos de una palabra reservada, dependiendo del caso donde se utilice. Como si no hubiera ya suficientes palabras reservadas de las cuales hay que aprender su significado y función.
En este post se resumirá el uso de la palabra reservada const
en C++.
Usos de const
en C++
//o preferentemente
double const pi = 3.14159;
En este caso se esta declarando una constante de tipo double de nombre pi con el valor 3.14159. A diferencia de una variable, el valor de esta constante no se puede cambiar durante el programa. Después de su declaración, un intento en el programa por asignarle un valor a esta variable, ocasionaría un error de compilación.
Funciones y const
{
statements;
}
En este caso el parámetro parameter1 es de tipo type y es pasado por valor a la función. Lo cual quiere decir que se tiene que copiar el valor o contenido del parámetro a una variable dentro de la función. const
en este caso no permite que el valor de dicha variable se alterado dentro de la función. Es decir, este parametro, que dentro de la función se comporta como una variable, será de solo lectura. Un intento por asignarle un nuevo valor a esta variable ocasionaría un error de compilación.
{
statements;
}
En este caso el parámetro parameter1 es de tipo type y es pasado por referencia a la función (como lo indica el &). Lo cual quiere decir que no se tiene que copiar el valor el parámetro a una variable dentro de la función, ahorrando así tiempo durante el runtime y memoria en el stack. Esto es especialmente relevante cuando el tipo de dato type es de una clase que contiene mucha información. A cambio de esto, en el caso de que al llamar a la función se le entregue una variable como parámetro, se trabaja directamente con ella. const
en este caso no permite que el valor de dicha variable se alterado dentro de la función.
{
statements;
}
Los métodos de una clase tienen acceso a los miembros privados de esta. En este caso const
impide que los miembros de la clase sean modificados a través del método foo. Es decir, los miembros de la clase solo estarán disponibles para su lectura.
{
statements;
}
Esto no es más que la combinación de los dos casos anteriores. Una función o un método que no puede cambiar el valor de los miembros de una clase y que además toma un parámetro por referencia, del cual no puede cambiar su valor.
type data;
const type& foo()
{
statements;
return data;
}
//llamada a la función
Class c;
const type& t = c.foo();
Se trata de una función cuyo tipo de dato es una referencia constante a un elemento de tipo type. En el caso del ejemplo, la función regresa data, que es una variable de tipo type, t es una referencia constante que se asigna a data. Lo que implica que a través de t no es posible cambiar el valor de data.
La variable data en el ejemplo es una variable global.
Voila! Muy creepy, ¿n0?
Este último es para mi gusto el más feo de todos los casos, quizá porque no acostumbro usar “referencias como tipo de dato”. Para mi los punteros son más que suficiente, pero se dice que las referencias son más seguras que los punteros, así que conviene entender el uso de estas, para en dado caso considerar su uso.
Punteros y const
//o preferentemente
type const * variable;
Un puntero de este tipo (pointer to const data) no permite la modificación de los datos a través de el. La información contenida por este puntero no puede ser asignada a un puntero normal sin un const_cast
.
Este es un puntero con una dirección de memoria constante. Debido a que la dirección de memoria es constante, a este puntero se le debe asignar un valor de inmediato.
//o preferentemente
type const * const variable = some memory address;
Este clase de punteros es una combinación de los dos casos anteriores. Se trata de un puntero con el cual no es posible modificar la información a la cual apunta, y que además la dirección de memoria a la cual apunta permanece constante. En necesario también asignarle un valor directamente en la declaración.
¿Falta algún caso?
Escribe un comentario 😉
muy buen post! 🙂