Usar el calificador de const con punteros en C++

Jinku Hu 12 octubre 2023
  1. Usar la notación const type var para declarar un objeto de sólo lectura en C++
  2. Usa el calificador const con punteros para manejar objetos de sólo lectura en C++
Usar el calificador de const con punteros en C++

Este artículo demostrará múltiples métodos sobre cómo usar un calificador const con punteros en C++.

Usar la notación const type var para declarar un objeto de sólo lectura en C++

El C++ proporciona la palabra clave const como calificativo para los objetos que deben ser definidos como de sólo lectura (inmutable). Las variables const se declaran con la notación const type var o type const var, ambas son sintácticamente correctas, pero la primera se usa como estilo convencional. Dado que los objetos calificados como const no son mutables, deben ser inicializados durante la declaración. Esto hace que una declaración const int number; sea inválida y arroje un error de compilación (probablemente tu IDE también gritará por ello).

Cuando la variable const se inicializa, no se le puede asignar un valor diferente durante el tiempo de ejecución. Por lo tanto, la tercera línea de la función main del siguiente ejemplo es inválida, y el compilador no la procesará. Tenga en cuenta que si declara un puntero al mismo tipo de una variable y luego intenta asignarle la dirección de la variable const, el error es reportado por el compilador. Note que este último error es usualmente anulado si compilamos con la bandera -fpermissive.

#include <iostream>

int main() {
  const int number = 1234;

  number = 235;        // Error
  int *ptr = &number;  // Error

  return 0;
}

Usa el calificador const con punteros para manejar objetos de sólo lectura en C++

El calificativo const se usa a menudo con punteros. Hay tres tipos de declaraciones const type * var, type *const var y const type *const var. La primera declara el puntero var como objeto de sólo lectura type, lo que significa que el objeto no puede ser modificado pero el puntero en sí sí sí puede serlo. El segundo - var puntero de sólo lectura a type de objeto, donde declaramos único, un puntero inmutable al objeto que puede ser modificado, y el último define ambos - puntero y el objeto como inmutables.

Estas notaciones proporcionan múltiples características útiles que se exploran en los siguientes ejemplos de código. Como se muestra en el último ejemplo, no pudimos almacenar la dirección de la variable const en un puntero no-const, pero si añadimos el especificador const, la operación es válida. Sin embargo, todavía no podemos modificar el valor almacenado a través de un puntero recién declarado como se demuestra en la 4ª línea del bucle main:

#include <iostream>

using std::cout;
using std::endl;

#define STR(num) #num

int main() {
  const int number = 1234;

  const int *c_ptr = &number;
  //    *c_ptr = 42; // Error

  cout << STR(number) << " - " << number << endl;
  cout << STR(*c_ptr) << " - " << *c_ptr << endl;

  return 0;
}

Producción :

number - 1234
*c_ptr - 1234

Otra cuestión común mientras se usa el calificador const con punteros es la asignación de punteros no-const a los punteros que apuntan a los objetos de sólo lectura. Observa que, hay una nueva variable no-const number2 inicializada en el siguiente ejemplo de código, y el c_ptr que fue declarado como un puntero a un objeto const, está ahora asignado con la dirección de number2. Esta operación es legal en C++, y la consecuencia es que sólo podemos leer el valor almacenado en la variable number2 a través de c_ptr, pero cualquier modificación resultará en un error del compilador.

#include <iostream>

using std::cout;
using std::endl;

#define STR(num) #num

int main() {
  const int number = 1234;
  const int *c_ptr = &number;

  int number2 = 3456;
  c_ptr = &number2;
  //    *c_ptr += 12; // Error
  number2 += 12;

  cout << STR(number) << " - " << number2 << endl;
  cout << STR(*c_ptr) << " - " << *c_ptr << endl;

  return 0;
}

Producción :

number2 - 3468
*c_ptr - 3468
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Const

Artículo relacionado - C++ Pointer