Usa il qualificatore const con puntatori in C++

Jinku Hu 12 ottobre 2023
  1. Usa la notazione const type var per dichiarare un oggetto di sola lettura in C++
  2. Usa il qualificatore const con puntatori per gestire oggetti di sola lettura in C++
Usa il qualificatore const con puntatori 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
Autore: 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

Articolo correlato - C++ Const

Articolo correlato - C++ Pointer