Usar el calificador de const con punteros en C++
-
Usar la notación
const type var
para declarar un objeto de sólo lectura en C++ -
Usa el calificador
const
con punteros para manejar objetos de sólo lectura 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
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 FacebookArtículo relacionado - C++ Const
- Const al final de la función en C++
- La palabra clave const en C++
- Utilice la palabra clave const con punteros en C++