Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Langage C++
  3. Conversions de types
Extrait - Langage C++ De l'héritage C au C++ moderne (avec programmes d'illustration) (2e édition)
Extraits du livre
Langage C++ De l'héritage C au C++ moderne (avec programmes d'illustration) (2e édition) Revenir à la page d'achat du livre

Conversions de types

Hérité du C

L’opérateur de conversion hérité du C reste d’actualité en C++ et même en C#. Sa souplesse d’utilisation et sa lisibilité en font un outil de premier choix.

1. Le principe

Que se passe-t-il si des opérations avec des variables de types différents sont effectuées ? Par exemple :

#include <iostream> 
using std::cout; 
using std::endl; 
 
int main() 
{ 
    int i = 10; 
    float f = 34.9; 
    int iRes; 
    float fRes; 
 
    iRes = i + f; 
    fRes = i + f; 
    cout << "iRes : " << iRes << ", fRes : " << fRes << endl;// 1 
 
    iRes = i / (i + 5); 
    fRes = i / (i + 5); 
    cout << "iRes : " << iRes << ", fRes : " << fRes << endl;// 2 
 
    iRes = f / i; 
    fRes = f / i; 
    cout << "iRes : " << iRes << ", fRes : " << fRes << endl;// 3 
 
 
    std::cin.get(); 
    return 0;  
} 

Voici en C et C++ la règle à connaître pour le savoir :

  • L’opération arithmétique s’effectue dans le type de l’opérande le plus fort.

  • L’affectation s’effectue dans le type du membre de gauche, celui de la variable qui reçoit la valeur.

Le premier affichage donne :

iRes : 44, fRes : 44.900000. 

L’opération est faite en float, le type le plus fort. Avec l’affectation, le résultat est...

Apports du C++

L’opérateur de conversion (cast) du C est conservé. Mais pour des raisons de sécurité du code, la conversion explicite entre types différents est organisée en quatre parties, chacune disposant d’un opérateur spécifique. Ce sont les opérateurs :

  • static_cast<type>

  • const_cast<type>

  • reinterpret_cast<type>

  • dynamic_cast<type>

Ces opérateurs sont plus faciles à repérer dans le code et indiquent un type de conversion. Les trois premiers exécutent l’instruction de conversion à la compilation du programme, seul le dernier réalise la conversion au "run-time" pendant le fonctionnement du programme.

1. static_cast<type>

Cet opérateur de cast est dit statique parce que la conversion de type est réalisée à la compilation et non pendant le fonctionnement du programme. Il est très proche de l’opérateur cast du C. Il gère des conversions entre variables de même famille (entre les types char, short, int, long, float, double par exemple), quoique, la plupart du temps, ces conversions sont faites implicitement. Pour l’utiliser, il faut remplacer type par le type voulu et mettre l’expression à convertir à sa droite entre parenthèses :

int a; 
    static_cast<float>(a); // cette expression vaut float 

Avec ce cast, la valeur de a est considérée comme étant une valeur float (mais attention, la variable a reste de type int).

Le programme suivant permet d’obtenir un nombre aléatoire compris entre 0 et 1 :

#include <iostream> 
int main() 
{ 
    float f; 
    f = static_cast<float>(rand()) / RAND_MAX; 
    std::cout << f << '\n'; ...