appunti3s:cenni_ai_references
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | appunti3s:cenni_ai_references [2020/06/08 22:19] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Premessa ====== | ||
+ | Sia nel linguaggio C che in C++ si può effettuare il passaggio di parametri esclusivamente //per valore//, cioè copiando il contenuto delle variabili indicate tra parentesi. | ||
+ | Vedere esempio [[appunti3s: | ||
+ | Questo impedisce di effettuare delle modifiche sui //parametri effettivi// della funzione. | ||
+ | < | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Tuttavia, se al posto dei tradizionali tipi di dato (come //int//) si usano i puntatori (come //int*//), la funzione riesce ad accedere e a modificare anche i //parametro effettivi// | ||
+ | < | ||
+ | { | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | Come si può notare dal secondo esempio, questo appesantisce il codice costringendo ad aggiungere l' | ||
+ | |||
+ | I // | ||
+ | |||
+ | ====== References ====== | ||
+ | |||
+ | Quando una funzione ha come //parametro formale// un reference, al suo interno NON viene crea una nuova variabile locale, ma si lavora proprio sul //parametro effettivo// usando il parametro formale come il suo soprannome temporaneo. | ||
+ | < | ||
+ | La dichiarazione si legge in questo modo: | ||
+ | la funzione accetta come argomento un //reference a...// intero. | ||
+ | |||
+ | Purtroppo il simbolo //&//, usato in un altro luogo, possiede anche altri significati, | ||
+ | Il reference al momento della sua dichiarazione __deve__ essere sempre inizializzato, | ||
+ | |||
+ | <file cpp 20.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | // Serve a calcolare il triplo di un numero. | ||
+ | |||
+ | #include < | ||
+ | |||
+ | // questo modo di passare il parametro | ||
+ | // non crea una copia locale | ||
+ | // questa funzione e' di tipo void, cioe' non restituisce nulla (manca return) | ||
+ | |||
+ | void triplicare(int& | ||
+ | { | ||
+ | x = 3*x; | ||
+ | } | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int mioNumero, | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | triplicare(mioNumero); | ||
+ | | ||
+ | std::cout << "il triplo vale " << mioNumero << " | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== references costanti ====== | ||
+ | |||
+ | Premettendo //const// davanti ad un reference si __impedisce__ di modificare il //parametro effettivo// | ||
+ | |||
+ | Questo è utilizzato soprattutto quando il parametro effettivo è un " | ||
+ | |||
+ | <file cpp 21.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | |||
+ | #include < | ||
+ | |||
+ | // questo modo di passare il parametro | ||
+ | // passa l' | ||
+ | // il termine const evita modifiche indesiderate al parametro. | ||
+ | |||
+ | // NON creando una nuova variabile x, risparmio memoria! | ||
+ | // x è solo il soprannome temporaneo che viene dato a mioNumero | ||
+ | |||
+ | int triplicare(const int& x) | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int mioNumero; | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | std::cout << "il triplo di " << mioNumero | ||
+ | << " vale " << triplicare(mioNumero) " | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file cpp 22.cpp> | ||
+ | // Questo programma è stato scritto da Fabio. | ||
+ | |||
+ | // Serve a calcolare il triplo di un numero. | ||
+ | // I reference sono utili per risparmiare memoria | ||
+ | // anche sul tipo restituito dalla funzione | ||
+ | // basta aggiungere UN SECONDO reference (sempre preceduto da un const) | ||
+ | |||
+ | #include < | ||
+ | |||
+ | const int& triplicare(const int& x) | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int mioNumero; | ||
+ | |||
+ | std::cout << "Per favore scrivi un numero intero: "; | ||
+ | std::cin >> mioNumero; | ||
+ | | ||
+ | std::cout << "il triplo di " << mioNumero | ||
+ | << " vale " << triplicare(mioNumero) " | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Il nuovo alias davanti alla funzione evita di creare una nuova variabile temporanea che sarebbe necessaria anche per restituire il valore con // | ||
+ | Il nuovo //const// davanti alla funzione impedisce modifiche indesiderate a tale oggetto locale. | ||
+ | |||
+ | I const reference sono anche l' | ||
+ | |||
+ | vedere //Thinking in C++, capitolo 11: References & the Copy-Constructor pag.477// | ||
+ | |||
+ | ====== Funzioni costanti ====== | ||
+ | |||
+ | Le funzioni costanti sono importanti perché sono un buono strumento di correzione degli errori. | ||
+ | Basta aggiungere un modificatore //const// in fondo (alla fine) della firma della funzione. | ||
+ | Questo evita modifiche accidentali ai dati degli oggetti | ||
+ | |||
+ | Basta scrivere //const// __in fondo__ al nome della funzione per costringere il compilatore a fare un controllo che quella funzione non esegua alcuna istruzione di modifica su TUTTI i membri dato di quell' | ||
+ | |||
+ | Le funzioni di questo tipo sono anche le uniche che possono avere come argomenti interi oggetti costanti come: | ||
+ | * const Classe unOggetto | ||
+ | * const& Classe unOggetto | ||
+ | * const Classe* unOggetto | ||
appunti3s/cenni_ai_references.txt · Last modified: 2020/06/08 22:19 by 127.0.0.1