Pagina didattica di G. Servizi
Home >> Linguaggio C++ >> vocabolario C++


livello medio

static

La parola static può accompagnare la dichiarazione di una o più variabili e/o funzioni, e assume diversi significati secondo il contesto in cui è utilizzata:

  1. nell'ambito globale o di un namespace

  2. nell'ambito di una funzione

  3. nell'ambito di una class o una struct



1. Se viene usata nell'ambito globale o di un namespace, come in

static int ciccio;
int main( ) { }

significa che la variabile intera ciccio è sì visibile a tutte le funzioni compilate nello stesso documento, ovvero a quelle per cui sia impostata un'adeguata direttiva using namespace, ma è INVISIBILE a ogni funzione che sia compilata in un documento diverso. In questo senso si contrappone alla parola extern. Va da sé che questo uso è del tutto inutile e neutro per programmi contenuti in un unico documento.

2. Se viene usata nell'ambito di una funzione, come in

int funz( )
{
static int ciccio;
}

significa che la variabile intera ciccio CONSERVA il proprio valore tra un'esecuzione di funz e un'eventuale esecuzione successiva.
In altre parole la cella di memoria in cui vive ciccio NON VIENE DISTRUTTA quando la funzione termina ed è ritrovata tale e quale quando eventualmente funz venisse rieseguita. In questo contesto static si contrapponeva alla parola auto, come la si intendeva prima dello standard 2011, o alla parola register come la si intende tuttora.

3. Se viene usata nell'ambito di una class o di una struct, come in

class Ciccio {
static int ciccio;
};

significa che la variabile membro ciccio sarà CONDIVISA DA TUTTI gli oggetti della class Ciccio che saranno eventualmente istanziati. Dato quindi che la memoria per la variabile ciccio deve essere disponibile indipendentemente dal fatto che oggetti di quella classe siano istanziati o no, occorre ripetere la dichiarazione di ciccio nell'ambito globale, così, dopo la fine della definizione della classe:

int Ciccio :: ciccio;

Si noti l'uso dell'operatore :: (risolutore di ambito)

Osservazione:

È vietato inserire membri qualificati static in classi definite in ambiti di funzioni (cosiddette local classes) e in classi anonime, come erano le vecchie struct del C ANSI e come continuano a poter essere nel C++ allorché interessi solo istanziare oggetti contestualmente con la definizione della classe.

La qualifica static può essere attribuita anche a un metodo di una classe, con l'analogo significato di condivisione da parte di tutti i suoi oggetti.
Si osservi, però, che un metodo qualificato static non potrà mai accedere a membri della sua stessa classe che non siano a loro volta anch'essi così qualificati. Tanto meno potrà mai usare il puntatore this.
La ragione è semplice: un metodo static, per sua natura, potrebbe essere eseguito anche senza che sia ancora stato istanziato alcun oggetto della sua classe, e perciò anche quando tutte le variabili membro NON static NEPPURE ESISTONO. Ne segue che i metodi static sono usati essenzialmente per inizializzare membri static o per eseguire compiti di natura generale relativi alla classe cui appartengono, e indipendenti dal singolo oggetto che, eventualmente, li esegue.

Le novità introdotte dallo standard 2011, e relative all'inizializzazione di variabili membro direttamente nell'ambito della classe, sono discusse nel documento riguardante la parola const.

Torna in cima alla pagina