Jak konwertować typy danych w C++

Jak Konwertowac Typy Danych W C



Proces zmiany typu danych jednej zmiennej na inny nazywany jest w C++ konwersją typów lub rzutowaniem typów. Odbywa się to w celu wykonywania operacji matematycznych na zmiennych różnych typów danych, zapewniając kompatybilność ich typów danych. Konwersja typów optymalizuje kod. Na przykład podczas obliczania różnicy między dwiema zmiennymi, jeśli jedna liczba jest typu zmiennoprzecinkowego, a druga typu całkowitego, wówczas typ danych całkowitych zostanie przekonwertowany na typ zmiennoprzecinkowy w celu przeprowadzenia odejmowania.

Jak konwertować typy danych w C++

W C++ istnieją dwa sposoby zmiany typów danych:

Niejawna konwersja typów

Zgodnie z predefiniowanymi regułami kompilatora kodu C++, niejawna konwersja typów to konwersja typów przeprowadzana automatycznie przez kompilator, bez konieczności stosowania zewnętrznego wyzwalacza ze strony użytkownika. Ten typ konwersji zwykle ma miejsce w programie, gdy istnieje więcej niż jeden typ danych, a typ danych wyrażenia nie odpowiada typowi danych zmiennej używanej w tym wyrażeniu.







Aby uniknąć utraty danych podczas konwersji, kompilator domyślnie zmienia typ danych o niskiej precyzji na typ danych o większej precyzji. Na przykład skonwertuje liczbę całkowitą na liczbę zmiennoprzecinkową, zamiast zmieniać liczbę zmiennoprzecinkową na liczbę całkowitą, aby zapobiec utracie danych. Nazywa się to promocją. Poniżej znajduje się diagram pierwszeństwa dla różnych typów danych.





Zamówienie na konwersję typu

Prawidłowa kolejność konwersji typów jest podana jako:





bool-- > znak -- > krótki int-- > int-- > int bez znaku -- > długi -- > bez znaku, długi -- > długo, długo -- > platforma -- > podwójne -- > długi podwójny

Zmienna typu o niskiej precyzji jest konwertowana na typ danych o wysokiej precyzji, aby zapobiec utracie danych.

Przykład 1

W tym przykładzie dodawanie odbywa się na zmiennej o różnych typach danych przy użyciu niejawnej konwersji typów.



#include
za pomocą przestrzeń nazw st ;

wew główny ( ) {
wew numer = 100 ;
zwęglać postać = 'C' ;
cout << '100 + 'C' = ' << numer + postać << koniec ;

platforma wal = numer + 'C' ;
cout << 'wartość zmiennoprzecinkowa(100 + 'c') = ' << wal << koniec ;

wew był = 7890 ;
długi nie był = był ;
cout << 'var_int = ' << nie był ;
powrót 0 ;
}

Tutaj dodawana jest liczba całkowita i znak z tabeli ASCII oraz liczba zmiennoprzecinkowa i znak „c”. Liczba całkowita jest przechowywana w trzecim segmencie jako długi typ danych, a typy danych są zmieniane przez sam kompilator w oparciu o jego predefiniowane reguły.

Suma 100 i „C” zwraca 167, ponieważ „C” równa się 67 w liczbach, a 100+ „c” zwraca 199, ponieważ małe „c” równa się 99. Zmienna int jest przechowywana w długim typie danych.

Przykład 2

W tym przykładzie znak D jest konwertowany na liczbę zmiennoprzecinkową w celu wykonania operacji dzielenia.

#include
za pomocą przestrzeń nazw st ;

wew główny ( ) {
zwęglać X = 'D' ;

platforma float_var ;

float_var = platforma ( X ) / 'C' ;
// Jawna konwersja typu int na float.

cout << „Wartość float_var to:” << float_var << koniec ;

powrót 0 ;
}

Wartość wejściowa ma postać znaku D, który jest przechowywany w typie danych zmiennoprzecinkowych i dalej dzielony przez znak C. Znaki te są zamieniane na wartości liczbowe i wykonywana jest na nich operacja dzielenia, zwracając wartość w postaci zmiennoprzecinkowej.

Jawna konwersja typów

Użytkownik musi ręcznie zmienić typ danych za pomocą jawnej konwersji typów w C++, często zwanej rzutowaniem typów. Ten typ rzutowania ma na celu uniknięcie ukrytej konwersji typu. Istnieją dwie metody przeprowadzania jawnego rzutowania typów w C++:

  • Konwersja za pomocą operatora przypisania
  • Konwersja za pomocą operatora rzutowania

Wpisz konwersję przy użyciu operatora przypisania w języku C++

Konwersja typów za pomocą operatora przypisania odbywa się na siłę, co oznacza, że ​​jeden typ danych jest konwertowany ręcznie na inny. Osiąga się to za pomocą operatora przypisania „=”, który przypisuje wartość prawego operandu zmiennej po jej lewej stronie.

Przykład
Ten program oblicza obszar koła za pomocą rzutowania typu.

#include
#include
za pomocą przestrzeń nazw st ;
wew główny ( )
{
wew promień ;
cout <> promień ;
platforma obszar = M_PI * promień * promień ;
cout << „Obszar koła o promieniu” << promień << ' = ' << obszar ;
}

Operator przypisania służy do przypisania wartości zmiennoprzecinkowej do obszaru, na który składa się wartość promienia w typie danych całkowitych.

Pole koła jest zwracane w typie danych zmiennoprzecinkowych, natomiast promień jest wprowadzany w typie całkowitym. Zatem typ danych zmiennej jest zmieniany poprzez rzutowanie typów przy użyciu operatora przypisania.

Konwersja typu przy użyciu operatora rzutowania w języku C++

Konwersja typów odbywa się za pomocą operatora rzutowania, który wymusza zmianę jednego typu danych na inny zgodnie z potrzebami programu.

Istnieją cztery różne operatory obsady:

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpretuj_cast

1: static_cast

static_cast to operator rzutowania używany do jawnej konwersji liczb zmiennoprzecinkowych i znaków na liczby całkowite i tak dalej. Jest to najbardziej podstawowy operator rzutowania. Może rzutować typy danych o podobnym charakterze. Potrafi konwertować wskaźniki z jednej formy na drugą, dzięki czemu można go również używać do zarządzania pamięcią.

Składnia

static_cast ( wyrażenie )

Przykład
Ten program został zbudowany w celu konwersji zmiennej double na typ danych int przy użyciu static_cast. Spowoduje to odcięcie dowolnej części dziesiętnej na wyjściu.

#include
za pomocą przestrzeń nazw st ;
wew główny ( )
{
// zadeklaruj zmienną
podwójnie P ;
P = 2905 * 1235 * 24675 ;
platforma wynik ;

cout << „Przed użyciem rzutowania statycznego:” << koniec ;
cout << ' Wartość p = ' << P << koniec ;

// użyj static_cast do konwersji typu danych
wynik = static_cast ( P ) ;
cout << ' Po użyciu rzutowania statycznego: ' << koniec ;
cout << ' Wartość wyniku = ' << wynik << koniec ;

powrót 0 ;
}

Początkowo do podwójnej zmiennej p ładowane są wartości, które są przez siebie mnożone i zapisywane w wyniku. Wynik zawiera wynik przed i po operatorze static_cast:

Przed użyciem operatora static_cast wynik wyświetlany jest w postaci kropek dziesiętnych, natomiast po zastosowaniu tego operatora w postaci danych typu integer.

2: const_cast

Operator const_cast służy do konwersji wartości stałej obiektu na typ inny niż stały. Używa się go, gdy deklarowany jest obiekt stały i od czasu do czasu musimy zmienić jego wartość.

Składnia

const_cast ( wyrażenie )

Przykład
W tym przykładzie operator const_cast służy do tymczasowego usunięcia kwalifikatora stałej i umożliwia dokonanie zmian w zmiennej w zależności od potrzeb:

#include
za pomocą przestrzeń nazw st ;
wew główny ( ) {
konst wew X = 70 ;
konst wew * I = & X ;
cout << „Stara wartość to” << * I << ' \N ' ;
wew * z = const_cast ( I ) ;
* z = 90 ;
cout << „Nowa wartość to” << * I ;
powrót 0 ;
}

Kwalifikator stałej jest przypisany do zmiennej int x, co oznacza, że ​​tej zmiennej nie można bezpośrednio modyfikować. Następnie int *y, który jest wskaźnikiem, jest używany do uzyskania dostępu do x, ale nadal nie można go zmienić, a jego pierwotna wartość jest wyświetlana za pomocą cout. Za pomocą operatora const_cast tworzony jest wskaźnik z, który nie jest stały i służy do uzyskiwania dostępu do wartości x, dzięki czemu można go edytować. Zmienia wartość przypisaną do z o 90, co pośrednio zmienia wartość w x.

Początkowo wartość stałej zmiennej x wynosi 70, która jest modyfikowana za pomocą operatora const_cast, co daje wartość 90.

3: dynamic_cast

z hierarchią dziedziczenia, która jest również określana jako downcast bezpieczny dla typu. Rzutowanie w dół to proces konwertowania referencji lub wskaźnika na klasę pochodną z referencji lub wskaźnika klasy bazowej.

Składnia

dynamic_cast ( wyrażenie )

Przykład
W tym przykładzie operator dynamic_cast służy do sprawdzania typu klasy polimorficznej i umożliwia dostęp zarówno do elementów klasy podstawowej, jak i pochodnej.

#include
#include
za pomocą przestrzeń nazw st ;
klasa Baza
{
publiczny :
platforma podstawa_g = 9,81 ;

wirtualny próżnia atrapa ( )
{

} ;
} ;

klasa Pochodne : publiczny Baza
{
publiczny :
wew lokalny_g = 9,78 ;
} ;

wew główny ( )
{

Baza * baza = nowy Pochodne ;
Pochodne * pochodny ;

pochodny = dynamic_cast ( baza ) ;

cout < podstawa_g << koniec ;
cout < lokalny_g << koniec ;

getchar ( ) ;
powrót 0 ;
}

Dwie klasy są zdefiniowane jako klasy podstawowe i pochodne. Tworzona jest baza wskaźników typu TBase*, która jest przypisywana do dynamicznie alokowanego obiektu typu TDerived. W tym przypadku polimorfizmu obiekt klasy pochodnej można przypisać do wskaźnika klasy bazowej. Dynamic_cast sprawdza, czy wskaźnik uzyskuje dostęp do prawidłowego obiektu TDerived. Jeśli rzutowanie zakończy się pomyślnie, klasa pochodna otrzyma prawidłowy wynik, w przeciwnym razie zwróci wartość null.

4: reinterpretacja_cast

Reinterpret_cast przekształca wskaźnik jednego typu danych na wskaźnik innego typu danych. Nie sprawdza, czy typy danych wskaźników są takie same, czy nie. Z tego operatora odlewania należy korzystać i obchodzić się z nim ostrożnie.

Przykład
Na tej ilustracji wskaźnik jednego typu danych jest reinterpretowany na wskaźnik innego typu danych za pomocą reinterpret_cast:

#include
za pomocą przestrzeń nazw st ;

wew główny ( )
{
wew * Q = nowy wew ( 70 ) ;
zwęglać * rozdz = reinterpretuj_cast ( Q ) ;
cout << * Q << koniec ;
cout << * rozdz << koniec ;
cout << Q << koniec ;
cout << rozdz << koniec ;
powrót 0 ;
}

Początkowo liczbie całkowitej przypisuje się wartość 70. Wskaźnik q wskazuje tę dynamicznie przydzielaną liczbę całkowitą. Reinterpret_cast służy do reinterpretacji wskaźnika q jako wskaźnika znakowego ch, co oznacza, że ​​pamięć pierwotnie przypisana do q jest teraz traktowana tak, jakby była znakiem. Za pomocą polecenia cout wypisuje wartość przypisaną do q i ch. Ponieważ ch jest traktowane jako wskaźnik znaku, zwróci wartość znakową.

Wypisuje wartość wskazywaną na ch przy użyciu *ch. Jednakże, ponieważ ch jest traktowane jako wskaźnik znaku, ta linia zinterpretuje pamięć jako znak. Drukuje adres pamięci zapisany we wskaźniku ch za pomocą ch. Jest to ten sam adres pamięci co q, ponieważ jest to po prostu reinterpretacja tej samej pamięci.

Początkowo liczba całkowita przechowuje 70. Później jest to manipulowane pomiędzy wskaźnikiem q i wskaźnikiem ch. Wyniki 2 i 4 są takie same, ponieważ druga wartość jest reinterpretowana za pomocą reinterpret_cast.

Notatka : Sugeruje się, aby nie używać tego operatora obsady, dopóki nie będzie to bardzo potrzebne, ponieważ sprawia to, że obiekt staje się produktem nieprzenośnym

Wniosek

Proces zmiany typu danych jednej zmiennej na inny nazywany jest w C++ konwersją typów lub rzutowaniem typów. Odbywa się to w celu wykonywania operacji matematycznych na zmiennych różnych typów danych, zapewniając kompatybilność ich typów danych. Konwersja typów optymalizuje kod. W C++ istnieją niejawne i jawne konwersje typów. Niejawna konwersja typów jest przeprowadzana przez sam kompilator przy użyciu predefiniowanego zestawu reguł, podczas gdy jawna konwersja typów jest przeprowadzana przez programistę za pomocą operatorów przypisania i operatorów rzutowania.