Salta ai contenuti
Manuale LogoManuale Logo

Scope delle Variabili

Una variabile è visibile solo nella parte di codice in cui è stata dichiarata. Quando quella parte termina, la variabile locale non è più disponibile.

Questa area di visibilità si chiama scope.

In C++, ogni coppia di { } crea una nuova zona di codice con il proprio scope. Le variabili dichiarate dentro quella zona esistono solo lì:

int main() {
int x = 10;
{
int y = 20; // y esiste solo in questo blocco interno
cout << x; // OK: x è visibile anche qui
cout << y; // OK: y è visibile qui
}
cout << x; // OK: x esiste ancora
// cout << y; // ERRORE: y non esiste più, il blocco è finito
}

Una variabile locale è dichiarata dentro una funzione. Esiste solo finché quella funzione è in esecuzione, e non è visibile dall’esterno:

void miaFunzione() {
int x = 10; // x esiste solo dentro miaFunzione
cout << x; // OK
}
int main() {
miaFunzione();
// cout << x; // ERRORE: x non esiste qui
return 0;
}

Ogni chiamata alla funzione crea una nuova copia delle variabili locali, che poi sparisce quando la funzione termina.

Una variabile globale è dichiarata fuori da qualsiasi funzione. È visibile da tutto il codice nel file:

int contatore = 0; // variabile globale, visibile ovunque
void incrementa() {
contatore++; // può accedere e modificare la variabile globale
}
int main() {
cout << contatore << endl; // 0
incrementa();
incrementa();
cout << contatore << endl; // 2
return 0;
}

Usa le variabili globali con cautela: qualsiasi funzione può modificarle, rendendo più difficile seguire il flusso dei dati.

Le variabili dichiarate dentro un for esistono solo per la durata del ciclo:

for (int i = 0; i < 5; i++) {
cout << i << " "; // OK
}
// cout << i; // ERRORE: i non esiste più fuori dal ciclo

Il contatore i resta così confinato al ciclo.

Shadowing: quando due variabili hanno lo stesso nome

Sezione intitolata “Shadowing: quando due variabili hanno lo stesso nome”

Se dichiari una variabile locale con lo stesso nome di una globale, la locale “nasconde” la globale dentro il suo scope. Si chiama shadowing:

int x = 100; // variabile globale
void funzione() {
int x = 50; // variabile locale, nasconde quella globale
cout << x; // stampa 50 (usa la locale)
}
int main() {
cout << x; // stampa 100 (usa la globale)
funzione();
cout << x; // stampa 100 (la globale non è cambiata)
return 0;
}

Evita lo shadowing: usa nomi diversi per variabili diverse. Il codice è molto più chiaro.

Normalmente, una variabile locale ricomincia da zero ogni volta che la funzione viene chiamata. Con la parola chiave static, il valore viene conservato tra una chiamata e l’altra:

void contaChiamate() {
int locale = 0; // ricomincia da 0 ad ogni chiamata
static int statica = 0; // conserva il valore tra le chiamate
locale++;
statica++;
cout << "Locale: " << locale << ", Statica: " << statica << endl;
}
int main() {
contaChiamate(); // Locale: 1, Statica: 1
contaChiamate(); // Locale: 1, Statica: 2
contaChiamate(); // Locale: 1, Statica: 3
return 0;
}

I parametri di una funzione si comportano come variabili locali: esistono solo dentro la funzione.

void funzione(int a, int b) {
// a e b sono locali a questa funzione
int somma = a + b;
cout << somma;
}
// a, b e somma non esistono qui
  • Dichiara le variabili vicino a dove le usi: non in cima alla funzione se le usi solo alla fine.
  • Evita le variabili globali quando possibile. Preferisci passare i valori come parametri.
  • Evita lo shadowing: dai nomi diversi alle variabili in scope diversi.
// Meno chiaro: variabile dichiarata lontano dall'uso
int risultato;
// ... molte righe di codice ...
risultato = a + b;
// Più chiaro: dichiarazione e uso insieme
int risultato = a + b;