Dal C al C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Pietrodn (discussione | contributi)
m +cat
Nessun oggetto della modifica
Riga 596:
La variabile potrà essere utilizzata solo dopo il punto in cui è stata definita, fino alla chiusa del blocco più interno nel quale è stata definita.
Vediamo un esempio:
void f() {
int a;
a = 0;
int b; // Valido
b = 0;
c = 0; // Illegale, perché precede la definizione
int c;
{
int d;
d = 0;
static int e;
}
d = 0; // Illegale, qui "d" è già stata deallocata
e = 0; // Illegale, qui "e" esiste ancora, ma non è più accessibile
}
d = 0; // Illegale, qui "d" è già stata deallocata
e = 0; // Illegale, qui "e" esiste ancora, ma non è più accessibile
}
 
All'interno di una struttura o di una classe, è possibile usare il qualificatore "static" per una variabile membro.
Riga 634:
Stampa invece "1 4 3 4", perché dopo che la variabile membro "b" ha ricevuto il valore "2" come membro della struttura "c1", riceve il valore "4" come membro della struttura "c2".
 
Dichiarare statica una variabile membro di una struttura o classe significa dichiarare una variabile cheper cui viene istanziataistanziato un oggetto una sola volta prima che sia chiamata la funzione "main", qualunque sia il numero di oggetti che verrannovengono creati in esecuzione (anche nessuno).
Tale oggetto statico viene creato prima che sia chiamata la funzione "main", e viene distrutto dopo che la fine della funzione "main".
 
Si noti che dopo la definizione della struttura C, c'è la seguente riga:
int C::b;
Questa è la "definizione" della variabile membro "b", che era stata solo "dichiarata" nella struttura C.
 
Questa distinzione tra il concetto di "dichiarazione" e quello di "definizione" esiste anche in linguaggio C.
In quest'ultimo linguaggio è frequente, e in C++ un po' meno frequente, avere variabili globali accessibili da più unità di compilazione (che sono i file con estensione ".c").
 
Tutte le unità di compilazione che vogliono utilizzare una variabile globale la devono ''dichiarare'', ma siccome ci deve essere una sola istanza condivisa di tale variabile, una sola unità di compilazione la deve ''definire''.
Le dichiarazioni si distinguono dalle definizioni in quanto precedute dalla parola-chiave "extern".
Inoltre, tipicamente, le dichiarazioni sono contenuti in file separati (cosiddetti "header", cioè "intestazioni"), inclusi nell'unità di compilazione con la direttiva "#include".
Le definizioni sono invece poste direttamente nell'unità di compilazione.
Se si omette di definire una variabile dichiarata e non utilizzata, tale variabile è semplicemente ignorata.
Se invece si omette di definire una variabile dichiarata e utilizzata, non ci sono problemi solo in fase di compilazione, ma viene generato un errore in fase di collegamento (in inglese, "linking").
 
Una definizione di una struttura contiene le dichiarazioni delle sue variabili membro.
Le variabili membro non statiche, non hanno bisogno di definizione, in quanto vengono istanziate quando si istanzia la struttura stessa.
Invece, le variabili membro statiche devono essere definite analogamente alle variabili globali, in quanto si tratta di variabili che devono essere inserite dal linker nell'area statica.
 
Per definire una variabile membro statica, si usa una sintassi analoga a quella usata per definire una variabile globale, con la differenza che prima del nome della variabile si deve porre il nome della classe o struttura, separata dall'operatore "::".
 
L'operatore "::" non esiste in C. Si tratta dell'operatore di "risoluzione dell'ambito" (in inglese, "scope resolution").
Il suo fine è indicare al compilatore dove cercare il nome indicato alla sua destra.
Alla sinistra di tale operatore ci può essere il nome di una struttura o classe, oppure il nome di un namespace (come "std"), oppure anche niente, come nella seguente istruzione.
::a = 3;
Questa istruzione assegna il valore 3 alla variabile globale di nome "a".
L'operatore serve a indicare che tale il variabile non deve essere confusa con eventuali variabili locali o parametri di funzione con lo stesso nome.
Se esiste una variabile globale e una variabile locale con lo stesso nome, e non si usa l'operatore di risoluzione dell'ambito, il compilatore intente che si intenda riferirsi alla variabile locale.
 
== I contenitori standard ==