Conversii de tip
În multe expresii lucrăm cu valori de tipuri diferite, de exemplu un număr întreg și unul real. În astfel de situații, C++ trebuie să aducă valorile la un tip comun înainte de a face calculul. Acest proces se numește conversie de tip și poate fi automat (implicit) sau cerut explicit de programator.
Conversia implicită
Conversia implicită este transformarea automată a unei valori dintr-un tip în altul, făcută de compilator atunci când este nevoie, fără ca noi să o cerem.
Când într-o expresie apar tipuri diferite, valorile sunt convertite automat către tipul „mai cuprinzător”, ca să nu se piardă informație. De exemplu, într-o operație între un int și un double, întregul este transformat în double:
int a = 3;
double b = 2.5;
cout << a + b; // a devine 3.0, rezultatul este 5.5
Tot o conversie implicită are loc și la o atribuire: dacă punem o valoare reală într-o variabilă întreagă, partea zecimală se pierde.
int x = 3.9;
cout << x; // afiseaza 3, partea zecimala este eliminata
Conversia către un tip „mai mic” poate duce la pierderi: trunchierea zecimalelor (de la real la întreg) sau chiar valori greșite, dacă numărul nu încape în noul tip. Este bine să fim conștienți când are loc o astfel de conversie.
Conversia explicită (cast)
Conversia explicită, numită și cast, este transformarea unei valori într-un alt tip, cerută explicit de programator prin construcția
(tip)expresie.
Cel mai frecvent caz la liceu este împărțirea reală a două numere întregi. Așa cum am văzut la operatori, împărțirea a doi întregi este o împărțire întreagă. Dacă vrem rezultatul zecimal, convertim explicit unul dintre operanzi în double:
int a = 7, b = 2;
cout << a / b; // 3 (impartire intreaga)
cout << (double)a / b; // 3.5 (a devine real, impartirea este reala)
Este suficient ca un singur operand să fie real: prin conversie implicită, celălalt va fi adus și el la double, iar împărțirea se face corect.
Atenție la poziția conversiei. (double)(a / b) mai întâi face împărțirea întreagă (rezultatul 3) și abia apoi convertește, obținând 3.0, nu 3.5. Conversia trebuie aplicată înainte de împărțire, asupra unui operand.