Newsgroup: it.comp.lang.c++
Titolo: funzioni in c++

salve a tutto il ng. so che questa domanda potrebbe sembrare banale, ma
sono giorni che cerco di trovare una risposta. abbiamo affrontato
all'uni nel corso di c++ l'argomento funzioni procedure ecc... e il
professore insisteva sul fatto dei 'parametri passati per valore' e dei
'parametri passati per riferimento'. ora io ho lavorato un po su questo
concetto ma nn so se sono arrivato ad una conclusione esatta. vi chiedo
di capire se ho interpretato bene: i 'parametri per valore'
praticamente sono dei parametri passati in una funzione che servono per
'produrre' un valore per esempio mediante un' espressione, e nn vengono
modificati perche la funzione li 'usa' solamente per il suo scopo (e li
cancella una volta finita l'esecuzione). i 'parametri per riferimento'
invece sono piu utili nelle procedure quando alla fine dell'esecuzione
si vogliono modificare i due parametri iniziali passati nella funzione,
che altrimenti resterebbero invariati. e' corretto quello che dico
oppure ho capito male? (scusate se sono stato prolisso ^^)


Conviene prima di tutto distinguere il funzionamento dai suoi possibili
scopi.
Le modalita' di passaggio dei parametri sono una caratteristica di
tutti i linguaggi di programmazione. Si parla di passaggio per valore
quando il parametro viene copiato in una zona di memoria riservata alla
funzione. La funzione potra' quindi modificarlo a piacimento, ma queste
modifiche non si ripercuoteranno sul valore originale. Nel caso invece
del passaggio per riferimento nell'area riservata alla funzione viene
copiato l'indirizzo della variabile passata come argomento e la
funzione se ne serve per accedere al valore originale. In questo caso,
a meno che non sia impedito dal linguaggio (ad es. con una
dichiarazione const), se la funzione modifica il valore del parametro
la modifica rimarra' in effetto anche dopo che l'esecuzione della
funzione sara' terminata.
In C++ il passaggio per valore si effettua dichiarando un parametro del
tipo desiderato, ad esempio
void f(int i);
Mentre il passaggio per riferimento richiede di dichiarare il
paramentro come reference o puntatore al tipo
void g(int & i);
void h(int * i);
Ciao,
Nicola

grazie nicola. mi hai chiarito ulteriormente le idee. ^^

 void h(int * i);
A voler essere precisi il secondo (il passaggio di un puntatore) è un
passaggio per valore, il passaggio per riferimento si ha solo con i
riferimenti.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 riferimenti.
Dipende dai punti di vista. In termini generali il passaggio di
parametri tramite puntatore puo' essere visto come un modo di
implementare il passaggio per riferimento ed e' ad esempio l'unico
disponibile in C.
Se pero' ci si aspetta di operare sui parametri dall'interno della
funzione con *esattamente* la stessa sintassi, come ad esempio avviene
in Pascal con i parametri var, allora non si puo' che concordare con
te. In questo senso potremmo dire che il C non ha passaggio per
reference o che Java passa per valore i tipi nativi e per reference gli
oggetti.
Ciao,
Nicola

aiutooooooo!! non confondetemi le idee!!! ^^

 disponibile in C.
Che infatti, è risaputo, ha solo il passaggio per valore.
Non è questione di punti di vista, ma un dato di fatto.
Come spieghi che all'interno della funzione è possibile modificare il 
valore del puntatore? Evidentemente non hai passato l'oggetto per 
riferimento, ma un puntatore che punta all'oggetto.
Sono due cose nettamente diverse.
Kiuhnm

 aiutooooooo!! non confondetemi le idee!!! ^^
Se il passagggio è per valore l'oggetto passato viene /copiato/ e la 
funzione lavora su una copia. Modificare la copia /non/ modifica 
l'originale.
Curiosità: i programmatori passano spesso oggetti per valore, ma non 
vogliono che gli utenti facciano lo stesso con il loro software (vedi 
"pirateria informatica").
Il passaggio per riferimento /non/ esegue la copia dell'oggetto passato, 
ma lavora /direttamente/ sull'originale.
Perché usarlo?
1) Copiare una struttura molto grande richiede tempo.
2) Con il passagio per riferimento la funzione può modificare l'oggetto 
originale.
Se poi si vogliono i vantaggi del punto 1 senza l'effetto collaterale 
del punto 2, è sufficiente definire l'oggetto passato come costante 
tramite "const". Per i dettagli leggiti un buon libro sul C++.
Kiuhnm


Nono ho capito, il non confondetemi era riferito alle divagazioni su
puntatori!! -.-°° il libro che ho è fondamenti di c++ di cay
horstmann, e secondo me è un buon libro, solo ke nn fa esempi
'calzanti': ossia, o solo situazioni estreme, o situazioni sbagliate,
ma mai la situazione _tipo_ grazie a tutti cmq!! ^^

 o che Java passa per valore i tipi nativi e per reference gli oggetti.
In effetti è così.
