| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
Nel linguaggio C++ tutti i sotto-programmi sono funzioni. Per poter simulare le procedure che non ritornano alcun valore è disponibile il tipo void. Il tipo void o tipo indefinito è utilizzato dal C++ tutte le volte che il valore di ritorno di una funzione non deve essere preso in considerazione. In pratica nel linguaggio C++ le procedure sono funzioni che restituiscono un void.
La costruzione e l’uso di una funzione, può essere schematizzata in tre fasi:
La definizione della funzione cioè l’elenco delle operazioni svolte dalla funzione stessa. La definizione comincia specificando il tipo di valore ritornato, subito dopo viene specificato il nome scelto a piacere dal programmatore e coerentemente con le regole della scelta del nome delle variabili, segue poi l’elenco dei parametri e infine le dichiarazioni locali e le istruzioni così come dallo schema seguente dove è evidenziato anche lo stile di scrittura:
tipo-ritornato nome-funzione(dichiarazione parametri)
{
dichiarazioni ed istruzioni
}
Le definizioni di funzioni possono essere scritte in qualsiasi punto del programma: verranno mandate in esecuzione in seguito alla chiamata e quindi non ha alcuna importanza il posto fisico dove sono allocate. Sono però comuni delle convenzioni secondo le quali le definizioni delle funzioni sono codificate dopo il main.
Fra le istruzioni contenute nella definizione della funzione particolare importanza assume l’istruzione return utilizzata per ritornare al chiamante un valore. La sintassi dell’istruzione prevede di specificare dopo la parola chiave return un valore costante o una variabile compatibile con il tipo-ritornato dalla funzione. Es.
return 5; // Ritorna al chiamante il valore 5 return a; // Ritorna al chiamante il valore contenuto nella variabile a
Non è importante che le definizioni di tutte le funzioni usate in un programma seguano l’ordine con cui sono chiamate sebbene, per motivi di chiarezza e leggibilità, è opportuno che sia così e che si segua l’ordine specificato prima. In ogni caso la funzione con il nome main è eseguita per prima, in qualunque posto sia messa, e le funzioni sono eseguite nell’ordine in cui sono chiamate.
Di conseguenza a quanto richiesto dalla sintassi si può osservare, inoltre, che main è una funzione che ritorna un valore intero. Tutto ciò fa parte di una concezione delle funzioni ereditata dal linguaggio C: una funzione ritorna sempre un valore che indica la conclusione corretta dell'elaborazione (valore 0 o altro valore se si sono riscontrati problemi). E questo è anche il motivo per cui in C tutti i sotto-programmi sono funzioni.
La particolarità che distingue la funzione main (che è un nome riservato) da qualsiasi altra funzione con nome scelto dal programmatore, consiste nel fatto che il codice di una funzione generica viene eseguito quando la funzione viene chiamata, il codice presente nella funzione main viene eseguito in automatico all'avvio del programma: è la prima funzione che viene chiamata dal Sistema Operativo all'avvio del programma che la contiene, in questa poi ci saranno le istruzioni per le chiamare ad altre funzioni.
Il prototipo della funzione. Si dichiara all’inizio del programma, prima della definizione della funzione main, o in ogni caso prima della chiamata, la funzione che sarà definita dopo. Si riscrive in pratica quanto specificato nella prima riga della definizione della funzione. Il prototipo rappresenta l'interfaccia della funzione: quanti parametri necessitano alla funzione per espletare i propri compiti e il loro tipo.
I prototipi sono stati introdotti per permettere al compilatore di effettuare un controllo sulla quantità e sui tipi di parametri: conoscendoli in anticipo, infatti, all’atto della chiamata è possibile stabilire se i parametri passati sono congruenti con quelli attesi. Per questo motivo nel prototipo non è necessario specificare il nome dei parametri: sono indispensabili solo la quantità e il tipo.
Nella costruzione di programmi complessi capita di utilizzare molte funzioni. In questo caso le funzioni sono raggruppate in librerie e i rispettivi prototipi sono raggruppati nei files di intestazione (header files). Si è avuto modo di utilizzare librerie di funzioni fin dall’inizio. Per esempio sia cin che cout sono funzioni (in realtà si tratta di oggetti, ma ciò sarà chiarito in seguito) contenute in una libreria di sistema che è inclusa, all’atto della compilazione, nel nostro programma. Tali funzioni sono definite nel namespace std dello header iostream che viene incluso all’inizio del programma.
La chiamata della funzione. Consiste semplicemente nello specificare, laddove occorre utilizzare l’elaborazione fornita dalla funzione, il nome della funzione stessa, eventualmente preceduto dall'operatore di visibilità e dal namespace in cui è definito, e l’elenco dei parametri passati. Il programma chiamante può utilizzare il valore restituito dalla funzione e in tal caso il nome della funzione figurerà, per esempio, in una espressione. Il chiamante può anche trascurare il valore restituito anche se non è di tipo void. Basta utilizzare la funzione senza assegnare il suo valore restituito.
| http://ennebi.solira.org |
ennebi@solira.org |