Konwersja typów danych w C++
Konwersja typów (ang. type casting) w C++ polega na zmianie jednego typu danych na inny. Jest to niezbędne, gdy chcemy wykonać operacje na różnych typach lub dopasować dane do wymagań funkcji.
1. Rodzaje konwersji typów
1.1 Konwersja implicit (automatyczna / niejawna)
- Zachodzi automatycznie, gdy typ mniejszej precyzji jest przypisywany do typu większej precyzji.
- C++ wykonuje ją samodzielnie.
Przykład:
-
Typowe przypadki:
int → doublefloat → doublechar → int
Uwaga: implicit conversion może prowadzić do utraty precyzji przy przypisaniu typu większego do mniejszego.
1.2 Konwersja explicit (rzutowanie / jawna)
- Programista wymusza zmianę typu danych przy pomocy operatora rzutowania.
- Stosuje się, gdy konwersja automatyczna jest niemożliwa lub chcemy kontrolować wynik.
Składnia starego stylu (C-style):
1.3 Nowoczesne rzutowanie C++ (C++-style)
C++ wprowadza cztery typy rzutowania, które są bezpieczniejsze i bardziej czytelne:
| Operator | Opis | Przykład |
|---|---|---|
static_cast |
konwersja między typami powiązanymi logicznie | int i = static_cast<int>(3.14); |
dynamic_cast |
rzutowanie wskaźników lub referencji w hierarchii klas (polimorfizm) | Base* b = dynamic_cast<Base*>(derivedPtr); |
const_cast |
usuwanie lub dodawanie const |
int* p = const_cast<int*>(&x); |
reinterpret_cast |
konwersja bitowa między typami niepowiązanymi | long l = reinterpret_cast<long>(ptr); |
Najczęściej stosowane: static_cast i const_cast.
2. Konwersja między typami liczbowymi
2.1 Liczby całkowite ↔ zmiennoprzecinkowe
- Utrata precyzji: przy konwersji
double → intczęść ułamkowa zostaje obcięta. - Rozszerzenie typu: przy konwersji
int → doublenie ma utraty informacji.
2.2 Konwersja znaków
- Wartości typu
chartraktowane są jako liczby ASCII przy konwersji do int.
2.3 Konwersja logiczna
- W C++ każdy niezerowy int traktowany jest jako
true, a0jakofalse.
3. Konwersja wskaźników
3.1 Wskaźniki między klasami w hierarchii
- Upcasting: z klasy pochodnej do bazowej (implicit)
- Downcasting: z klasy bazowej do pochodnej (explicit)
3.2 reinterpret_cast
- Służy do konwersji wskaźników lub liczb w sposób bitowy.
4. Konwersja typów w wyrażeniach
- Wiele operacji matematycznych wymusza konwersję typów w locie.
- Jeśli oba typy są całkowite, wynik również będzie całkowity:
Rozwiązanie:
5. Konwersja między string a liczba
- W C++11+ można użyć funkcji z
<string>i<cstdlib>:
| Funkcja | Opis | Przykład |
|---|---|---|
stoi(s) |
string → int | stoi("123") → 123 |
stol(s) |
string → long | stol("123456") → 123456 |
stof(s) |
string → float | stof("3.14") → 3.14f |
stod(s) |
string → double | stod("3.14") → 3.14 |
to_string(x) |
liczba → string | to_string(42) → "42" |
6. Konwersja między wskaźnikami a typami liczbowymi
- Możliwe przez
reinterpret_cast
- Zazwyczaj stosowane w systemach niskopoziomowych lub przy debugowaniu.
7. Podsumowanie
- W C++ mamy dwa główne rodzaje konwersji: niejawna (implicit) i jawna (explicit / rzutowanie).
- Implicit: automatyczna, często bezpieczna, ale może powodować utratę precyzji.
- Explicit: kontrolowana przez programistę, stosuje się
static_cast,dynamic_cast,const_cast,reinterpret_cast. -
Konwersje obejmują:
- typy liczbowe (
int,double,float) - znaki (
char) - wskaźniki i referencje
- typ logiczny (
bool) - stringi (
std::string)
- typy liczbowe (