Uso y alcance de const en C++

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:

  1. No se puede modificar el valor mediante el puntero.
  2. Debe usarse const void* para amlacenar direcciones de objetos constantes.
  3. 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 };

Etiquetas: C++ const Punteros funciones-constantes miembros-constantes

Publicado el 8-26 22:10