C++: Reference e puntatori

BoG3
Ciao, ho 2 domande :)

1)
che differenza c'è tra le 2 unzioni:
int & h(){int x = 0; return x;} //ERRORE
int & g(){static int x = 0; return x;} //OK


Non capisco che ruolo gioca "static" in quella dichiarazione. perchè la seconda funzione è corretta e la prima no?

2)
main(){
  truct p{
    int x;
    int y;
    enum color{BLACK, BLUE, RED};
  };
  struct p a, *pa;
  a.x = 3;
  a.y = 5;
  a.color = RED;
  pa = a;
  cout << a.x << ", " << pa->y << ", " << (pa).color;
}


la differenza tra il punto e -> è.. ? Magari qnd uso il punto sono gia' posizionato sulla truttura mentre con -> sono posizionato sulla cella di memoria che punta alla struttura?

Risposte
apatriarca
Un reference è sostanzialmente un puntatore costante con una sintassi un po' più comoda. Nella prima funzione stai restituendo l'indirizzo di una variabile locale che cesserà di esistere all'uscita dalla funzione. Potrebbe funzionare lo stesso, ma è senza dubbio un errore. Nel secondo caso invece stai restituendo l'indirizzo di una variabile statica e che quindi continuerà ad esistere anche dopo l'uscita dalla funzione. In ogni caso usare un reference in questo caso è con ogni probabilità la cosa sbagliata da fare..

L'unica differenza tra il punto e la freccia è che il primo va usato con variabili di tipo strutturato e reference ad esse, mentre la freccia va usata con i puntatori.. Per il resto sono la stessa cosa e se hai un reference con ogni probabilità verranno convertite nello stesso codice.

BoG3
Ah... pensavo ci sarebbe stato un errore al tempo di compilazione, è per quello che non mi tornava.
grazie

giogiomogio
Io dubito che con esempi cosi stupidi gli studenti possano capire...
fare esempi concreti, reali, è troppo difficile?
scusami posso chiederti dove stai studiando?

nel commento //OK
in realtà non è OK, il programma gira, ma e' una schifezza fare una roba del genere....
ad ogni modo una variabile static fa 2 cose fondamentali...
la prima e' quella che ti ha detto apatriarca
la seconda e' quella di proteggere (stile incapsulamento) il tuo programma...
proteggere il tuo programma nel senso che se hai una variabile globale di tipo static... la puoi utilizzare SOLO all'interno del modulo... da altri moduli non la puoi cambiare... potresti fare un get() e set() e allora in quel caso la variabile static puo essere modificata perche la interroghi direttamente all interno dello stesso modulo da dove e' stata creata/inizializzata.


ciau

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.