Per conversione di tipo si intende una
operazione volta a trasformare un valore di un certo tipo in un altro valore di
altro tipo. Questa operazione e` molto comune in tutti i linguaggi, anche se spesso
il programmatore non se ne rende conto; si pensi ad esempio ad una operazione
aritmetica (somma, divisione...) applicata ad un operando di tipo int e uno
di tipo float. Le operazioni aritmetiche sono definite su operandi dello
stesso tipo e pertanto non e` possibile eseguire immediatamente l'operazione; si
rende quindi necessario trasformare gli operandi in modo che assumano un tipo
comune su cui e` possibile eseguire l'operazione. Quello che generalmente fa, nel
nostro caso, un compilatore di un qualsiasi linguaggio e convertire il valore
intero in un reale e poi eseguire la somma tra reali, restituendo un reale.
Non sempre comunque le conversioni di tipo sono decise dal compilatore, in alcuni
linguaggi (C, C++, Turbo Pascal) le conversioni di tipo possono essere richieste
anche dal programmatore, distinguendo quindi tra conversioni implicite e
conversioni esplicite. Le prime (dette anche coercizioni) sono eseguite dal
compilatore in modo del tutto trasparente al programmatore, mentre le seconde
sono quelle richieste esplicitamente:
int i = 5; float f = 0.0; double d = 1.0; d = f + i; d = (double)f + (double)i; // questa riga si legge: d = ((double)f) + ((double)i)L'esempio precedente mostra entrambi i casi.
( < NuovoTipo > ) < Valore > // oppure < NuovoTipo > ( < Valore > ) // ma questo metodo puo` essere utilizzato solo con // nomi semplici (ad esempio non funziona con char*)NuovoTipo puo` essere una qualsiasi espressione di tipo, anche una che coinvolga tipi definiti dall'utente; ad esempio:
int a = 5; float f = 2.2; (float) a // oppure... float (a) // se Persona e` un tipo definito // dal programmatore... (Persona) f // oppure... Persona (f)Le conversioni tra tipi primitivi sono gia` predefinite nel linguaggio e possono essere utilizzate in qualsiasi momento, il compilatore comunque le utilizza solo se il tipo di destinazione e` compatibile con quello di origine (cioe` puo` rappresentare il valore originale). Le conversioni da e a un tipo definito dall'utente richiedono che il compilatore sia informato riguardo a come eseguire l'operazione.
class Test { private: float member; public: Test(int a); }; Test::Test(int a) { member = (float) a; }Il metodo va naturalmente bene anche quando il tipo di partenza e` un tipo definito dall'utente.
Test::operator int() { return (int) member; }Se cioe` si desidera poter convertire un tipo utente X in un tipo primitivo T bisogna definire un operatore con nome T:
X::operator T() { /* codice operatore */ }Si noti che non e` necessario indicare il tipo del valore restituito, e` indicato dal nome dell'operatore stesso.
DA: | A: |
---|---|
T | T& |
T& | T |
T[ ] | T* |
T(args) | T (*) (args) |
T | const T |
T | volatile T |
T* | const T* |
T* | volatile T* |