Le funzioni nel C++: suddividere un programma in più parti, La breve guida di Metal H sul C++ - Capitolo III

« Older   Newer »
  Share  
Metal H
view post Posted on 16/6/2006, 13:04




Uhm... questo è un bel blocco da affrontare... però proviamo: il passaggio di parametri alle funzioni.
Voi sapete che una funzione riceve dei parametri (che possono essere variabili, insiemi di variabili, oggetti etc.).
Fino ad ora, questa era la nostra funzione tipo:
CODICE
int quadrato_val ( int x )
{
   return x * x;
}

Vediamo un po' i pregi e i difetti di questo tipo di funzione.
Quando io faccio una chiamata a quadrato, ossia uso la funzione, in questo modo, ad esempio,
CODICE
cout << quadrato_val ( 6 );

tutto funziona perfettamente: il controllo del programma passa alla funzione, la funzione calcola 6^2, la funzione restituisce, con l'istruzione return, il valore 36 al programma, il controllo ritorna al programma, viene stampato 36, il rpogramma prosegue.
Pare che non ci sia nessuna pecca. Invece, non è così.
Il passaggio di parametri alla funzione in questo modo è detto passaggiodi parametri per valore. Cosa significa? Quando io chiamo la funzione, non le passo la variabile x vera e propria.
Mi spiego meglio. Ammettiamo di usare la funzione sualla variabile a:
CODICE
b = quadrato_val ( a );

La funzione non modifica a! Alla fine, la variabile a rimane 6.
Se invece noi volessimo modificare l'argomento o gli argomenti della funzione, ci serviremmo dell'operatore
CODICE
&

che, posto prima di una variabile, ne restituisce l'indirizzo di memoria, in questo modo:
CODICE
&a

Che cos'è l'indirizzo di memoria di una variabile? È semplicemente il luogo esatto dove si trovano le informazioni scritte in essa all'interno della memoria. Una variabile, infatti, è riferibile tramite un nome, ad esempio
CODICE
var1

e tramite un indirizzo di memoria, ad esempio
CODICE
0x0064FDFF

in notazione solitamente esadecimale (in base 16).
Vediamo un esempio di funzione che riceve parametri in questo nuovo modo, detto per riferimento:
CODICE
void quadrato_rif ( int &x )
{
   x *= x
}

Cosa è cambiato?
Questo funzione non restituisce alcun valore (void) perché agisce direttamente su x, in quanto l'argomento che riceve non è più il valore di x ma la variabile stessa.
L'istruzione
CODICE
x *= x;

equivale all'istruzione
CODICE
x = x * x;

è solo un modo più sintetico di scriverla, voi usate pure il secondo.
A questo punto, voi potreste chiedere: ma alla fine, cosa cambia? Per adesso, apparentemente niente, infatti la "pecca" di cui parlavo prima non era un vero e proprio difetto. La vedremo comunque quando tratteremo i puntatori.
Per adesso, vi basti sapere che esiste anche questo modo di passare i valori alle funzioni.
i due modi hanno scopi diversi e differenti usi. Con la seconda versione, non sarà più possibile scrivere
CODICE
cout << quadrato_rif ( 6 );

l'istruzione dovrebbe darvi un errore di sintassi.
D'altra parte, per far sì che il valore di b passi da 7 a 49 basterà scrivere
CODICE
quadrato_rif ( b );

senza bisogno di alcun assegnamento.
 
Top
15 replies since 28/2/2006, 14:15   1557 views
  Share