PDA

View Full Version : [C++] Scope e visibilità di una variabile


leon84
21-05-2007, 12:06
Salve,
credevo che lo scope o la visibilità di una variabile fossero la stessa cosa ma il libro che sto leggendo attribuisce due significati differenti ma non riesco a capire.

Portata o scope : è l'ambiente (blocco, funzione, modulo o programma completo) ove resta definita una variabile

Visibilità : è la proprietà secondo la quale, all'interno del proprio campo di validità, il nome della variabile è visibil, cioè può essere usato.

Che diavolo di differenza c'è ? non capisco

k0nt3
21-05-2007, 12:19
Salve,
credevo che lo scope o la visibilità di una variabile fossero la stessa cosa ma il libro che sto leggendo attribuisce due significati differenti ma non riesco a capire.

Portata o scope : è l'ambiente (blocco, funzione, modulo o programma completo) ove resta definita una variabile

Visibilità : è la proprietà secondo la quale, all'interno del proprio campo di validità, il nome della variabile è visibil, cioè può essere usato.

Che diavolo di differenza c'è ? non capisco
penso che intenda che è possibile "oscurare" la visibilità di una variabile nonostante la variabile sia comunque dentro lo scope (e quindi definita). dipende dal linguaggio comunque.

es in java:


public class Prova {
private String stringa = null;

public Prova(String stringa) {
stringa = "sono il campo stringa della classe Prova o il parametro del costruttore?";
}
}


in questo esempio quando si accede alla variabile stringa nel costruttore si accede al parametro del costruttore stesso e non al campo definito nella classe. per accedere a quest'ultimo, visto che la sua visibilità è oscurata dal parametro, bisogna farlo esplicitamente dicendo this.stringa
non so se mi sono spiegato :fagiano:

ps. ah ora ho letto che riguarda c++.. dovrebbe essere la stessa cosa comunque

leon84
21-05-2007, 12:30
penso che intenda che è possibile "oscurare" la visibilità di una variabile nonostante la variabile sia comunque dentro lo scope (e quindi definita). dipende dal linguaggio comunque.

es in java:


public class Prova {
private String stringa = null;

public Prova(String stringa) {
stringa = "sono il campo stringa della classe Prova o il parametro del costruttore?";
}
}


in questo esempio quando si accede alla variabile stringa nel costruttore si accede al parametro del costruttore stesso e non al campo definito nella classe. per accedere a quest'ultimo, visto che la sua visibilità è oscurata dal parametro, bisogna farlo esplicitamente dicendo this.stringa
non so se mi sono spiegato :fagiano:

Mmm... ti posto l'esempio che fa :


Modulo C

extern T s();
extern T z;
static T f();
static T y;
main()
{
int x=1;
}

T f()
{
static int w=3;
T* a = new T ;
...
...
delete a;
}

Modulo S
T z = valore iniziale;
T s(...) { ... }



L'autore assume che :

la variabile z ha portata nell'intero programma e visibilità nei moduli C e S

la variabile y ha portata nell'intero programma e visibilità nel solo modulo C

la variabile w ha portata nella funzione f() e visibilità in f()


Non riesco a capire ancora la differenza tra visibilità e funzione

k0nt3
21-05-2007, 12:38
Mmm... ti posto l'esempio che fa :


Modulo C

extern T s();
extern T z;
static T f();
static T y;
main()
{
int x=1;
}

T f()
{
static int w=3;
T* a = new T ;
...
...
delete a;
}

Modulo S
T z = valore iniziale;
T s(...) { ... }



L'autore assume che :

la variabile z ha portata nell'intero programma e visibilità nei moduli C e S

la variabile y ha portata nell'intero programma e visibilità nel solo modulo C

la variabile w ha portata nella funzione f() e visibilità in f()


Non riesco a capire ancora la differenza tra visibilità e funzione
mmm a questo punto non ho capito nemmeno io cosa intende con portata... la variabile y è dichiarata static nel modulo C, quindi è ovvio che in altri moduli non sia visibile, ma a questo punto non capisco cosa significa che ha portata nel modulo S. aspettiamo gente più ferrata :D
per la variabile z invece è chiaro.. è dichiarata extern in C e poi definita anche in S

leon84
21-05-2007, 12:44
La cosa strana è che ho sempre assunto lo scope di una variabile come la sua visibilità...

k0nt3
21-05-2007, 12:46
ecco googlando ho trovato qualcosa http://www.na.drr.cnr.it/depietro/FUNZIONI_new.pdf
leggi da pag 26! è esattamente ciò che ho detto inizialmente.. l'esempio del tuo libro è un pò oscuro.. tipo alla slide 28 dovresti capire tutto :cool:

leon84
21-05-2007, 12:47
ne approfitto intanto per un'ulteriore delucidazione : l'allocazione dinamica di un tipo T mediante il puntatore a.

Quando lo spazio di memoria puntato da a viene allocato nella funzione f() e questa termina senza il "delete a;" il contenuto di a resta cmq in memoria giusto ? Ciò che si perde è solo il suo puntatore giusto ?

k0nt3
21-05-2007, 12:53
si se non usi delete la memoria resta allocata, ma perdendo il puntatore non hai più modo di andarla ripescare (è un errore piuttosto comune quando si fanno grossi programmi in c++ o c).

per l'esempio del tuo libro invece credo di aver capito... la variabile y è static e questo comporta che il suo valore viene conservato durante tutta l'esecuzione del programma, anche se ti trovi nel modulo S, solo che è visibile solo quando sei nel modulo C. in pratica nel modulo S la variabile c'è ancora (perchè il suo valore deve essere conservato) ma non è raggiungibile.

leon84
21-05-2007, 12:58
si se non usi delete la memoria resta allocata, ma perdendo il puntatore non hai più modo di andarla ripescare (è un errore piuttosto comune quando si fanno grossi programmi in c++ o c).

per l'esempio del tuo libro invece credo di aver capito... la variabile y è static e questo comporta che il suo valore viene conservato durante tutta l'esecuzione del programma, anche se ti trovi nel modulo S, solo che è visibile solo quando sei nel modulo C. in pratica nel modulo S la variabile c'è ancora (perchè il suo valore deve essere conservato) ma non è raggiungibile.

si forse sarà così ... a volte è proprio complesso cercare di capire cosa l'autore voleva dire ...

k0nt3
21-05-2007, 13:00
ma di che libro si tratta?

leon84
21-05-2007, 13:03
Da c++ a uml di carlo savy