En C++, la palabra clave const permite definir valores inmutables, controlar modificaciones a través de punteros y restringir comportamientos en funciones miembro. Su posición y contexto alteran significativamente su efecto.
Punteros y const: tres combinaciones clave
La ubicación de const respecto al operador * determina qué parte es inmutable:
- Puntero a constante: El valor apuntado no puede modificarse.
const int *ptr;
int const *ptr; // equivalente
Reglas:
- No se puede modificar el valor mediante el puntero.
- Debe usarse
const void*para amlacenar direcciones de objetos constantes. - Se puede asignar la dirección de un objeto mutable, pero no modificarlo por este puntero.
Ejemplo: ``` const int value = 10; const void* vp = &value; int temp = 5; ptr = &temp; // válido: el puntero puede cambiar de destino *ptr = 6; // error: no se puede modificar el valor apuntado
- **Puntero constante**: La dirección almacenada no puede cambiarse.
int* const cptr;
Ejemplo:
int x = 1, y = 2; int* const cptr = &x; // debe inicializarse cptr = &y; // error: no se puede reasignar *cptr = 99; // válido: el valor sí puede modificarse
- **Puntero constante a constante**: Ni la dirección ni el valor pueden modificarse.
const int* const fixed_ptr;
### Funciones miembro const
Las funciones marcadas con `const` garantizan que no modificarán el estado del objeto. Solo pueden ser invocadas por objetos constantes si están declaradas como tales.
class Apple { public: int add(int n) const; // no modifica el objeto int add(int n); // puede modificar el objeto };
Un objeto `const Apple` solo puede llamar a `add(int) const`. Es buena práctica marcar como `const` cualquier función que no altere los miembros del objeto — el compilador detectará errores si se viola esta regla.
### Constantes dentro de clases
Antes de C++11, no era posible iincializar directamente miembros `const` en la declaración de la clase, ya que su valor debe establecerse en tiempo de construcción.
class A { const int SIZE; public: A(int s) : SIZE(s) {} // inicialización en lista de inicialización }; A obj(100); // SIZE = 100
Para constantes compartidas entre instancias, se puede usar `static const`, permitiendo inicialización directa en la declaración (si es de tipo integral):
class B { static const int MAX = 256; // válido en C++98/03 para enteros };