Usa il qualificatore const con puntatori in C++
-
Usa la notazione
const type var
per dichiarare un oggetto di sola lettura in C++ -
Usa il qualificatore
const
con puntatori per gestire oggetti di sola lettura in C++
Questo articolo mostrerà diversi metodi su come usare un qualificatore const
con puntatori in C++.
Usa la notazione const type var
per dichiarare un oggetto di sola lettura in C++
Il C++ fornisce la parola chiave const
come qualificatore per gli oggetti che devono essere definiti come di sola lettura (immutabili). Le variabili const
sono dichiarate con la notazione const type var
o type const var
, entrambe sintatticamente corrette, ma la prima è usata come stile convenzionale. Poiché gli oggetti qualificati const
non sono modificabili, devono essere inizializzati durante la dichiarazione. Questo fa una dichiarazione const int number;
- non valido e genera un errore del compilatore (probabilmente anche il tuo IDE ne griderà).
Quando la variabile const
è inizializzata, non può essere assegnato un valore diverso durante il runtime. Pertanto, la terza riga nella funzione main
del seguente esempio non è valida e il compilatore non la elaborerà. Nota che se dichiari un puntatore allo stesso tipo di una variabile e poi provi ad assegnargli l’indirizzo della variabile const
, l’errore viene segnalato dal compilatore. Si noti che quest’ultimo errore viene solitamente ignorato se si compila con il flag -fpermissive
.
#include <iostream>
int main() {
const int number = 1234;
number = 235; // Error
int *ptr = &number; // Error
return 0;
}
Usa il qualificatore const
con puntatori per gestire oggetti di sola lettura in C++
Il qualificatore const
viene spesso utilizzato con i puntatori. Ci sono tre tipi di dichiarazioni const type * var
, type *const var
e const type *const var
. Il primo dichiara il puntatore var
all’oggetto type
di sola lettura, il che significa che l’oggetto non può essere modificato ma il puntatore stesso può esserlo. Il secondo puntatore di sola lettura var
all’oggetto type
, dove dichiariamo unico, un puntatore immutabile all’oggetto che può essere modificato, e l’ultimo definisce il puntatore entrambi e l’oggetto come immutabili.
Queste notazioni forniscono molteplici funzioni utili che vengono esplorate nei seguenti esempi di codice. Come mostrato nell’ultimo esempio, non potremmo memorizzare l’indirizzo della variabile const
in un puntatore non const, ma se aggiungiamo l’identificatore const, l’operazione è valida. Attenzione però, non possiamo ancora modificare il valore memorizzato tramite il puntatore appena dichiarato, come dimostrato nella quarta riga 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;
}
Produzione:
number - 1234
*c_ptr - 1234
Un altro problema comune durante l’utilizzo del qualificatore const
con i puntatori è l’assegnazione dei puntatori non const ai puntatori che puntano agli oggetti di sola lettura. Si noti che c’è una nuova variabile non const number2
inizializzata nel prossimo esempio di codice, e c_ptr
che è stato dichiarato come puntatore all’oggetto const
, ora è assegnato con l’indirizzo number2
. Questa operazione è legale in C++, e la conseguenza è che possiamo solo leggere il valore memorizzato nella variabile number2
tramite c_ptr
, ma qualsiasi modifica risulterà in un errore del compilatore.
#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;
}
Produzione:
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 Facebook