Newsgroup: it.comp.lang.c++
Titolo: reference

Scusate la domanda banale, ma ancora non riesco a capire il significato di
questa sintassi...
sto studiando il C++ sul libro del Lippman, un libro stupendo ma un poco
ostico...
premetto che so abbastanza bene il C, e so qual'e' la differenza del
passaggio di un argomento per valore o per riferimento ecc..., e' solo che
non riesco a capire il significato di questa sintassi: es.
int &Calcola ( int *a);
Nel capitolo 3, lui fa un abbondante uso di questo modo di scrivere una
funzione.
Ho fatto mille prove per capire a che serve questa sintassi, ma con esiti
negativi, e quindi ho pensato di chiedervi una spiegazione, anche se la
domanda e', mi rendo conto, stupida, ma mi rendo conto che bisogna essere
umili, e' l'unico modo per capire...
Ha qualcosa a che vedere con quello che in C scriverei:
char *Ritorna(char szStringa)
{
    char *ptStringa = NULL;
    // esempio banale...
    strcpy(szStringa, "PROVA");
    strcat(szStringa, "***");
    ptStringa = (char*) malloc (strlen(szStringa) + 1);
    strcpy(ptStringa, szStringa);
    return ptStringa;
}
cosi' alla return di una fnzione esco dallo stack, ma non perdo il valore di
ptStringa, dopo, richiamando la funzione
faro'
char szAppo = {'\0'};
strcpy(szAppo, Ritorna(MiaVariabileStringa));
// oppure...
// char *szPointer = Ritorna(MiaVariabileStringa);
in pratica, se e' possibile con un esempio, che succede se implemento questa
funzione
int &Calcola ( int *a); ???
sono sicuro che con un esempio riusciro' a capire ( o almeno lo spero )
Seconda domanda: parlando del reference lui fa questo esempio:
int iSecondaVariabile = 20;
int &iPrimaVariabile =  iSecondaVariabile;
//adesso iSecondaVariabile varra' 10;
iPrimaVariabile  = 10;
pero' dice che se fai l'assegnamento
int &iPrimaVariabile =  1024;
e' errore e lo trovo giusto, pero' scrivendo
const int &iPrimaVariabile =  1024;
ma che senso ha la seconda espressione ???
ciao e grazie in anticipo!!!

 ma che senso ha la seconda espressione ???
va ad inserire nell'indirizzo di iPrimaVariabile il valore 1024!
Il motivo l'ho scritto sopra.


 ma che senso ha la seconda espressione ???
Sinceramente sembra strano anche a me.
const int &iPrimaVariabile =  1024;
neanche compila...
Ti sei dimenticato qualche pezzo nella spiega?
Ciao
Cesare

 Cesare
Questo esempio nonn e' stato molto significativo in quanto anche se la
funzione avesse restituito void, il chiamante avrebbe comunque avuto accesso
alla variabile modificata tramite puntatore passato alla funzione stessa:
#include <iostream>
void Calcola(int* a)
{
   // modifica oggetto puntato da a
   *a += 1;
}
int main()
{
    int b = 0;
    // applica Calcola a b
    Calcola(&b);
    std::cout << "b: " << b << std::endl;
    return 0;
}
Sinceramente non ho ancora trovato un esempio significativo che giustifichi
la funzione il cui prototipo sia questo che hai scritto:
int &Calcola ( int *a);
Posso trovare una giustificazione solo se all'interno di Calcola si e'
allocata una variabile dinamicamente e la si voglia far cambiare anche
dall'esterno della funzione, restituendola per reference, ma non mi e'
chiaro se ci sia un motivo valido per fare cio'.
Maurus

 neanche compila...
se non compila la colpa e` del tuo compilatore; la definizione qua sopra 
crea un temporaneo di tipo int inizializzato a 1024 e lo lega al 
reference iPrimaVariabile, cosa che e` espressamente ammessa dallo 
standard.
Viceversa
        int& i = 1024;
non compila perche` lo standard dice che un temporaneo puo` essere legato 
solo a reference const.
Per la cronaca, g++ 3.1 compila tranquillamente la riga incriminata...
ciao Anto
-- 
Antonio Cuni, 20 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 >     b = Calcola(&b);
/* Ciao Mauro, e' proprio questo che non capisco, che senso ha che la
funzione restituisca un reference lo associ ad a, quando a gia' viene
modificato in quanto viene gia' passato come argomento alla funzione???
forse e' vero che chi ha studiato il C si triva male all'inizio a capireb il
C++???
io in C avrei fatto:
void Calcola(int *a) {
*a =5;
}
 e poi l'avrei richiamata cosi': Calcola(&miavariabileintera);
mi sfugge l'utilita', o forse non ho capito a che serve, di restituire un
valore reference dalla funzione...
a che serve restituire un reference???
ciao e grazie in anticipo!!! */


 standard.
Ops. E' vero, hai ragione.
Grazie mille per il ragguaglio.


 chiaro se ci sia un motivo valido per fare cio'.
L'esempio volevo farlo cosi' solo che mi sembra un po' strano che il
chiamante di Calcola si debba ricordare di fare la delete dell'intero
allocato da Calcola.
Ciao
Cesare