Qual è la differenza tra variabile statica e costante?
Quello che la statica fa per le variabili è assegnare loro un indirizzo statico (che non cambia) nella memoria. Questo significa che a meno che il valore della variabile non sia esplicitamente cambiato, avrà lo stesso valore, non importa cos'altro si stia facendo nel codice. È una "classe" di memorizzazione, insieme alle variabili "automatiche", che è la memoria temporanea che risiede sullo stack, e la memoria che è memorizzata sull'heap. Ogni classe di memorizzazione si comporta in modo diverso.
Ho visto casi in cui è utile usare variabili statiche all'interno di funzioni. Ciò che la funzione fa per la variabile è fornire un ambito per la sua visibilità, non la sua durata (come per le variabili locali automatiche). Il codice al di fuori della funzione non può accedere ad una variabile statica locale. Questo permette effettivamente alla funzione di mantenere lo stato tra le volte in cui viene chiamata. Per vedere questo in azione, date un'occhiata alla funzione di libreria standard strtok().
Le costanti possono essere assegnate ad un valore solo una volta, e devono essere inizializzate ad un valore quando sono dichiarate (eccetto se stiamo parlando di parametri costanti C++ e tipi di ritorno nelle funzioni). Sono come un enum singolare, eccetto che non possono avere un tipo enum (sono solo il tipo con cui sono dichiarati, come "const int"). In ogni altro aspetto, si comportano come le variabili. Se sono dichiarati all'interno di una funzione, escono dallo scope quando la funzione esce. Lo stesso vale per i parametri const. A differenza di static, const non è una classe di memorizzazione. È effettivamente una bandiera per il compilatore che gli dice: "Questo identificatore può essere solo inizializzato ad un valore, e mai più cambiato."
Come ho detto, il designatore const in C++ può essere usato con parametri e tipi di ritorno nelle funzioni (static non può, per definizione, poiché tutti i parametri e valori di ritorno sono passati sullo stack). Nel caso di un parametro, impedisce che il parametro venga cambiato all'interno della funzione. Nel caso di un valore di ritorno, impedisce che il valore restituito sia modificato dal chiamante. A seconda del tipo di parametro/ritorno, può avere alcuni significati diversi. Se un parametro/tipo di ritorno è dichiarato const char *, impedisce che il puntatore venga cambiato (per esempio se qualche codice cerca di ottenere l'indirizzo del puntatore e cambiarlo, o se cerca di aumentarlo/decrementarlo). Tuttavia, char const * impedisce che il valore a cui punta il puntatore venga cambiato, ma permette di cambiare il puntatore. È possibile fare entrambe le cose: const char const *, nel qual caso il codice non può cambiare il puntatore, e non può cambiare il valore a cui punta. Nel caso di parametri const, per quanto riguarda il chiamante, non importerebbe se la funzione cambiasse il puntatore in ingresso, poiché tutti i parametri sono pass-by-value, e a livello del chiamante, il valore del puntatore rimarrebbe invariato, non importa cosa. Tuttavia, potrebbe importare se il valore a cui punta viene cambiato dalla funzione, poiché solo il puntatore viene passato per valore. Dove la dichiarazione di parametro const char *, per esempio, è (credo) richiesta è se si sta cercando di passare un array letterale in una funzione, come, SomeFn("Hello world.");
Le stesse regole per const si applicano anche agli alias, inclusi i parametri con alias.
Articoli simili
- È normale che un altoparlante JBL abbia un po' di statica quando è acceso e non c'è musica in riproduzione?
- Segnaletica digitale: Come posso prevenire il burn-in dello schermo su un display con un'immagine statica?
- Quali sono i diversi modi di produrre elettricità statica?
- In Unity 3d come faccio a decidere quale variabile mantenere come pubblica, protetta o interna?