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.

C base

Fondamenti solidi di programmazione

Impara le basi della programmazione in C in modo semplice, pratico ed efficace. Variabili, cicli, funzioni, logica e algoritmi.

  • 9 ore di corso registrato
  • Più di 50 algoritmi risolti passo passo
  • Livello base
  • 100% online, fruibile quando vuoi
#include <iostream>
using namespace std;

int main() {
    int x = 8, y = 3;
    float divisione;

    // dividendo due interi si perde la precisione
    divisione = x / y;  

    cout << "La divisione e': " << divisione << endl;
    return 0;
}

Questo programma darà come risultato 2 anzichè 2,67.

x / y → entrambi sono int.

  • La divisione intera viene eseguita prima di qualsiasi assegnazione.
  • Il risultato è 2, intero, e la parte frazionaria viene persa.

Assegnazione a divisione → qui entra in gioco il casting implicito da int a float.

L’intero 2 viene convertito in 2.0.

Se avessimo questa situazione:

int x = 8;
float y = 3;
float divisione;

divisione = x / y;

Si avrebbe:

  • x / y → x è un int, y è un float.
  • Quando si esegue l’operazione, il compilatore fa un casting implicito di x da int a float.
    • Ora la divisione diventa 8.0 / 3.0.
  • La divisione viene quindi eseguita in virgola mobile, restituendo 2.66667.
  • Il risultato viene assegnato a divisione (float), quindi non c’è perdita di precisione.

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.0;  // divisione in float
    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

Copertina: 50 Algoritmi per imparare C++
📚 Consigliato per te

50 Algoritmi per imparare C++

Struttura dati, puntatori e algoritmi classici in C++, passo passo.

Vedi su Amazon

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;  // divisione in virgola mobile

    cout << "La divisione e': " << divisione << endl;  // 2.66667
    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.

Tabella comparativa

CasoCodiceRisultatoSpiegazione
1. Nessun castint x=8, y=3; float divisione; divisione = x / y;2.0Entrambi gli operandi sono int, quindi divisione intera. Il risultato intero 2 viene poi assegnato a divisione (float). La parte frazionaria è persa.
2. Cast implicitoint x=8; float y=3; float divisione; divisione = x / y;2.66667x viene convertito automaticamente a float perché y è float. La divisione è in virgola mobile.
3. Cast esplicito C++ (funzione)int x=8, y=3; float divisione; divisione = float(x) / y;2.66667Usiamo float(x) per forzare la conversione a float prima della divisione. Risultato corretto in virgola mobile.
4. Cast esplicito C (vecchia notazione)int x=8, y=3; float divisione; divisione = (float)x / y;2.66667Stessa cosa del precedente, ma con sintassi più vecchia ereditata dal C.
5. Cast moderno C++ (static_cast)int x=8, y=3; float divisione; divisione = static_cast<float>(x) / y;2.66667La forma più sicura e leggibile in C++. Il cast è chiaro e il compilatore può controllarlo.

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++

2- Variabili in C++

3- Operatori di assegnazione in C++

4- Esempi in C++

5- Casting in C++

🐍

Vuoi imparare Python da zero?

Scarica la guida gratuita Python in 10 giorni: 10 lezioni pratiche con esempi ed esercizi, direttamente nella tua email.

📥 Scarica gratis il PDF →