Questo articolo parla del casting in C++, ovvero della converione di tipo di una variabile. Una conversione di tipo è un’operazione volta a trasformare un valore di un certo tipo in un valore di un altro tipo.
Questa operazione è comune in tutti i linguaggi.
Quando in un’espressione si utilizzano tipi di dati diversi può nascere il problema della conversione di tipo, che chiaramente non c’è per dati dello stesso tipo.
La conversione che viene eseguita dal compilatore stesso viene chiamata implicita, mentre la conversione decisa dal programmatore viene chiamata esplicita.
Facciamo subito degli esempi per capire il concetto.
Esempi di casting in C++
Casting implicito
Le conversioni implicite non richiedono nessun operatore per essere eseguite, ma sono eseguite in automatico.
#include <iostream>
using namespace std;
int main() {
int x = 8, y = 3;
float divisione;
divisione = x / y;
cout << "La divisione e': " << divisione;
return 0;
}
Questo programma darà come risultato 2 anzichè 2,67. Questo perchè ha effettuato un’operazione di casting implicito da float a int. Questa conversione ha procurato una perdita di precisione, in particolare è stata scartata la parte frazionaria.
Facciamo un altro esempio di casting in C++:
#include <iostream>
using namespace std;
int main() {
int base, altezza;
float area;
cout << "Calcoliamo l'area del triangolo, inserisci la base: ";
cin >> base;
cout << "Adesso inserisci l'altezza: ";
cin >> altezza;
area = base * altezza / 2;
cout << "L'area e': " << area;
return 0;
}
In questo esempio prendiamo la base e l’altezza di tipo intero e poi le utilizziamo per calcolare l’area che però è di tipo float. Anche qui si ha una perdita di precisione.
Se inseriamo ad esempio i valori: base=5 e altezza=3 otterremo area=7.
Casting esplicito
Continuiamo a parlare del casting in C++ introducendo il concetto di casting esplicito.
Nel casting esplicito l’operatore di cast è rappresentato in questo modo:
b=float(a); //notazione C++
mentre è comunque supportata:
b=(float)a; //vecchia notazione C
Quindi trasformiamo il secondo esercizio di prima con il casting esplicito:
#include <iostream>
using namespace std;
int main() {
int base, altezza;
float area;
cout <<"Calcoliamo l'area del triangolo rettangolo, inserisci la base: ";
cin >> base;
cout << "Adesso inserisci l'altezza: ";
cin >> altezza;
area = float(base) * altezza / 2;
cout << "L'area e': " << area;
return 0;
}
Se inseriamo gli stessi valori di prima: base=5 e altezza=3 otterremo l’area=7.5, quindi in questo caso non perdiamo la parte frazionaria.
Nelle versioni più recenti l’operazione di casting si rappresenta con static_cast.
La sintassi è questa:
static_cast <tipo> (espressione)
dove tipo è indicato tra due parentesi angolari < e >
espressione è racchiusa tra parentesi tonde e rappresenta l’espressione o la variabile da convertire.
Modifichiamo il primo degli esercizi che abbiamo presentato prima, facendo un’operazione di casting esplicito utilizzando:
static_cast <float> (x);
Ecco l’esempio completo di casting in C++:
#include <iostream>
using namespace std;
int main() {
int x = 8, y = 3;
float divisione;
divisione = static_cast<float>(x)/y;
cout << "La divisione e': " << divisione;
return 0;
}
In questo modo otteniamo come risultato 2,66667.
Si utilizza static_cast quando si è sicuri della validità della conversione perchè non c’è nessun controllo sulla compatibilità di tipi.
Esistono anche altri tipi di cast:
dynamic_cast, reinterpret_cast e const_cast ma ne parleremo più avanti.
Questi sono solo degli esempi di come può avvenire il casting in C++.
Alcuni link utili:
Indice argomenti linguaggio C++
1- Introduzione al linguaggio C++
3- Operatori di assegnazione in C++