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 → double
    • float → double
    • char → 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 → int część ułamkowa zostaje obcięta.
  • Rozszerzenie typu: przy konwersji int → double nie ma utraty informacji.

2.2 Konwersja znaków

  • Wartości typu char traktowane są jako liczby ASCII przy konwersji do int.

2.3 Konwersja logiczna

  • W C++ każdy niezerowy int traktowany jest jako true, a 0 jako false.

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)