Usos de const en C++

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++

const double pi = 3.14159;
//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

return_type foo(const type parameter1)
{
   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.

return_type foo(const type& parameter1)
{
   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.

   return_type foo(type parameter1) const
{
   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.

return_type foo(const type& parameter1) const
{
   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.

//declaración de la variable global data de tipo type
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

const type* variable;
//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.

type * const variable = some memory address;

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.

const type * const variable = some memory address;
//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 😉

Links relacionados

Autor: Arturo González

mexicano, ingeniero, programador

Un comentario en “Usos de const en C++”

Deja un comentario

This site uses Akismet to reduce spam. Learn how your comment data is processed.