Costanti
Cos’è una costante?
Sezione intitolata “Cos’è una costante?”Se il programma usa il numero pi greco in dieci punti, una modifica alla precisione richiederebbe dieci cambiamenti.
Anche un valore come 18, ripetuto senza spiegazione, non dice se rappresenta un’età minima, un limite o altro.
Le costanti risolvono entrambi i problemi: assegni un nome al valore e lo definisci una sola volta.
La parola chiave const
Sezione intitolata “La parola chiave const”Scrivi const prima del tipo per rendere una variabile costante. Una volta assegnato il valore, non può più essere cambiato.
const double PI = 3.14159265358979;const int ORE_PER_GIORNO = 24;const int ETA_MINIMA = 18;Se provi a modificare una costante, il compilatore ti blocca con un errore:
const int MAX = 100;MAX = 200; // ERRORE: non puoi modificare una costanteIl compilatore impedisce così le modifiche accidentali.
La convenzione dei nomi
Sezione intitolata “La convenzione dei nomi”In questa guida scriveremo i nomi delle costanti tutto in maiuscolo, con le parole separate da underscore. È una convenzione, non una regola del linguaggio, e permette di riconoscerle a colpo d’occhio:
const double PI = 3.14159;const int ETA_MINIMA = 18;const int MAX_TENTATIVI = 3;const double VELOCITA_LUCE = 299792458.0;Un altro modo: #define
Sezione intitolata “Un altro modo: #define”Il preprocessore del C++ offre anche la direttiva #define, ereditata dal C:
#define PI 3.14159#define MAX_STUDENTI 30Con #define, il preprocessore sostituisce ogni occorrenza di PI con 3.14159 prima della compilazione vera e propria. Non crea una variabile con un tipo: esegue una sostituzione di testo.
#include <iostream>#define PI 3.14159#define RAGGIO 5
using namespace std;
int main() { // Il compilatore sostituisce PI con 3.14159 e RAGGIO con 5 double area = PI * RAGGIO * RAGGIO; cout << "Area: " << area << endl; return 0;}const o #define? Usa const
Sezione intitolata “const o #define? Usa const”Per i valori costanti, in genere si preferisce const:
| Caratteristica | const |
#define |
|---|---|---|
| Ha un tipo definito | Sì | No |
| Il compilatore la controlla | Sì | No |
| Visibile nel debugger | Sì | No |
| Rispetta i blocchi di codice | Sì | No |
// Meglio: const ha tipo e viene controllataconst double PI = 3.14159;
// Meno sicuro: #define non ha tipo#define PI 3.14159constexpr: costanti calcolate durante la compilazione
Sezione intitolata “constexpr: costanti calcolate durante la compilazione”In C++ moderno esiste anche constexpr. Si usa per costanti il cui valore può essere calcolato già durante la compilazione (prima ancora che il programma venga eseguito):
constexpr int SECONDI_PER_MINUTO = 60;constexpr int MINUTI_PER_ORA = 60;// Il compilatore calcola 60 * 60 = 3600 prima ancora di eseguire il programmaconstexpr int SECONDI_PER_ORA = SECONDI_PER_MINUTO * MINUTI_PER_ORA;Per ora puoi usare tranquillamente const. Imparerai constexpr più avanti.
Esempio pratico
Sezione intitolata “Esempio pratico”#include <iostream>using namespace std;
// Costanti definite una volta sola, usate ovunque nel programmaconst double PI = 3.14159265358979;const double GRAVITA = 9.81; // accelerazione di gravità in m/s²const int MAX_VOTO = 10;
int main() { // Calcolo dell'area di un cerchio con raggio 4 double raggio = 4.0; double area = PI * raggio * raggio; cout << "Area cerchio (r=" << raggio << "): " << area << endl;
// Calcolo dell'energia potenziale di un oggetto double massa = 70.0; // kg double altezza = 5.0; // m double energia = massa * GRAVITA * altezza; cout << "Energia potenziale: " << energia << " J" << endl;
// Uso della costante del voto massimo int voto = 8; cout << "Voto: " << voto << "/" << MAX_VOTO << endl;
return 0;}Output:
Area cerchio (r=4): 50.2655Energia potenziale: 3434.5 JVoto: 8/10