type conversions c
Sprawdź różne konwersje typów obsługiwane w C ++.
Mamy nadzieję, że powinieneś znać wszystkie typy danych, które są dostępne w C ++ z naszych wcześniejszych samouczków. Czasami może pojawić się taka potrzeba, że musimy przekształcić jeden typ na inny. Nazywa się to konwersją typów lub rzutowaniem typów.
W tym samouczku omówimy różne konwersje typów obsługiwane w C ++.
najlepszy edytor tekstu dla pythona mac
=> Kliknij tutaj, aby uzyskać bezpłatny kurs C ++.
Czego się nauczysz:
Konwersje typów
C ++ obsługuje dwa typy konwersji typów:
- Niejawna konwersja typu: Niejawna konwersja typu jest automatyczna. Nie ma ingerencji użytkownika w ten typ konwersji, a kompilator bezpośrednio przeprowadza konwersję. Konwersja jest zwykle wykonywana, gdy w wyrażeniu występuje więcej niż jeden typ danych. Ale generalnie w tego typu konwersji istnieje możliwość utraty danych, utraty znaków lub przepełnienia danych.
- Jawna konwersja typu: Jawna konwersja typów jest definiowana przez użytkownika i zwykle nazywana jest „rzutowaniem typów”. Tutaj użytkownik rzutuje lub konwertuje wartość jednego typu danych na inny w zależności od wymagań. Tego typu konwersje są bezpieczniejsze.
Teraz zobaczymy szczegółowo oba typy konwersji typów.
Niejawna konwersja
W przypadku konwersji niejawnej kompilator przeprowadza konwersje z jednego typu danych na inny, gdy wyrażenie ma więcej niż jeden typ danych. Aby zapobiec utracie danych, wszystkie zmienne innych typów danych są konwertowane na największy typ danych. Nazywa się to promocją.
Rozumiemy konwersję niejawną przy użyciu przykładu kodu.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< Wynik:
10 + „A” = 75
float val (10 + „a”) = 107
var_int = 1000
Powyższy przykład kodu demonstruje niejawną konwersję. Zadeklarowaliśmy zmienną całkowitą i znakową o wartości odpowiednio 10 i „A”. Kiedy dodamy te dwie zmienne, następuje niejawna konwersja.
Ponieważ liczba całkowita jest większym typem w tym wyrażeniu, wartość zmiennej znakowej „A” jest konwertowana na jej odpowiednik w postaci liczby całkowitej, tj. Wartość 65 (wartość ASCII). Zatem wynik wyrażenia to 75.
W następnym wyrażeniu dodajemy liczbę całkowitą i znak („a” -> 97), a następnie przypisujemy wynik do float. Dlatego wynik wyrażenia jest niejawnie konwertowany przez kompilator na zmiennoprzecinkowy.
W trzecim wyrażeniu krótka zmienna int jest niejawnie konwertowana na liczbę całkowitą.
Uwaga : W przypadku niejawnych konwersji, jeśli kompilator wykryje potencjalną utratę danych, może wyświetlić ostrzeżenie o tym skutku.
Jawna konwersja
Jawna konwersja jest również nazywana „rzutowaniem typów”, ponieważ „rzutujemy” jeden typ danych na inny. Tutaj użytkownicy jawnie definiują rzutowanie, w przeciwieństwie do niejawnej konwersji, w której kompilator wewnętrznie przeprowadza konwersję.
Jawną konwersję możemy wykonać na dwa sposoby:
# 1) Korzystanie z operatora przypisania
Jawna konwersja lub rzutowanie typów przy użyciu operatora przypisania jest wykonywane w sposób wymuszony. Tutaj rzutujemy lub konwertujemy jeden typ danych na inny typ danych przy użyciu operatora przypisania.
Ogólna składnia to:
(data type) expression;
Poniższy przykład wyjaśnia to:
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< Wynik:
Suma = 5563
Comp = 5563,2
W powyższym przykładzie pokazaliśmy jawne rzutowanie przy użyciu operatora przypisania. Najpierw rzutujemy zmienną pensję typu double na typ całkowity. Następnie rzutujemy sumę zmiennej całkowitej na typ podwójny.
Jak pokazano na danych wyjściowych, typ, do którego rzutujemy, wskazuje ostateczny typ wyniku wyrażenia.
Jest to korzystne, ponieważ użytkownik może zmienić typ wyrażenia zgodnie z wymaganiami.
# 2) Korzystanie z operatora rzutowania
W tego typu rzutowaniu używamy „operatora rzutowania”, który jest operatorem jednoargumentowym do zmiany z jednego typu na inny.
Rodzaje odlewów
Mamy następujące typy odlewów w zależności od operatora odlewu, którego używamy:
1) Statyczna obsada
Rzutowanie statyczne jest najprostszym ze wszystkich rzutów przy użyciu operatora rzutowania . Rzutowanie statyczne jest w stanie wykonać wszystkie konwersje, które są wykonywane niejawnie. Wykonuje również konwersje między wskaźnikami klas powiązanych ze sobą (upcast -> fromived to base or downcast -> from base to pochodne).
Oprócz wyżej wymienionych konwersji, rzutowanie statyczne jest również w stanie przekonwertować dowolny wskaźnik na void *.
Rzutowanie statyczne to skompilowany rzut czasu. Oznacza to, że w czasie wykonywania nie jest wykonywane żadne sprawdzenie, czy wykonane rzutowanie jest prawidłowe, czy nie. W związku z tym do obowiązków programisty pozostaje zapewnienie, że konwersja była bezpieczna i ważna.
Innymi słowy, użytkownik musi upewnić się, że konwertowany obiekt był pełny w odniesieniu do docelowego typu danych.
Określamy rzutowanie statyczne w następujący sposób:
static_cast (expression)
Rozumiemy rzutowanie statyczne na przykładzie.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<W powyższym przykładzie nieznacznie zmodyfikowaliśmy kod, aby zawierał zmienną znakową o wartości „A”. Następnie deklarujemy wskaźnik całkowity i stosujemy rzutowanie statyczne, aby przekonwertować znak na wskaźnik całkowity.
Kiedy kompilujemy ten program, otrzymujemy następujące dane wyjściowe.
W funkcji „int main ()”:
10:35: błąd: nieprawidłowy static_cast z typu „char *” do typu „int *”
Program wyświetla błąd dla wykonanego rzutowania statycznego, ponieważ jest on nieprawidłowy. W związku z tym rzutowanie statyczne pozwala tylko na rzutowanie lub konwersje prawidłowego typu i daje błąd, gdy próbujemy wykonać niepożądane rzutowanie typów.
# 2) Dynamiczna obsada
Rzutowanie dynamiczne to rzutowanie w czasie wykonywania wykonywane w celu sprawdzenia poprawności rzutowania. Rzutowanie dynamiczne jest wykonywane tylko na wskaźnikach klas i referencjach. Wyrażenie zwraca wartość NULL, jeśli rzutowanie nie powiedzie się.
Dynamiczne rzutowanie wykorzystuje mechanizm znany jako RTTI (identyfikacja typu w czasie wykonywania) . RTTI udostępnia wszystkie informacje o typie danych obiektu w czasie wykonywania i jest dostępne tylko dla klas, które mają co najmniej jedną funkcję wirtualną (typ polimorficzny). RTTI umożliwia określenie typu obiektu w czasie wykonywania lub w czasie wykonywania.
Wypróbujmy jeden przykład, aby zrozumieć rzutowanie dynamiczne.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
W tym programie zdefiniowaliśmy dwie klasy, podstawową z funkcją wirtualną i wyprowadzoną z klasą bazową base.
jakie są dobre strony do oglądania anime
W funkcji głównej tworzymy obiekt klasy pochodnej wskazywany przez wskaźnik klasy bazowej. Następnie wykonujemy dynamic_cast na wskaźniku podstawowym wskazującym klasę pochodną, aby rzutować ją na wskaźnik klasy pochodnej.
Podobnie jak w klasie bazowej, baza jest polimorficzna (zawiera funkcję wirtualną), rzutowanie dynamiczne zakończyło się pomyślnie.
Uwaga: Jeśli usuniemy funkcję wirtualną z powyższej klasy, to dynamic_cast nie powiedzie się, ponieważ informacje RTTI dla obiektów nie będą dostępne.
Dynamiczne rzutowanie ma narzut związany z bezpieczeństwem typów w czasie wykonywania.
# 3) Zinterpretuj ponownie obsadę
Ten typ rzutowania jest najbardziej niebezpieczny w użyciu, ponieważ działa na każdym typie obiektu bez powiązanych ze sobą klas.
Reintepret_cast działa na dowolnych wskaźnikach i konwertuje wskaźnik dowolnego typu na dowolny inny typ, niezależnie od tego, czy wskaźniki są ze sobą powiązane, czy nie. Nie sprawdza, czy wskaźnik lub dane wskazywane przez wskaźnik są takie same, czy nie.
Operator rzutowania przyjmuje tylko jeden parametr, wskaźnik źródłowy do konwersji i nie zwraca żadnej wartości. Po prostu konwertuje typ wskaźnika.
Nie powinniśmy używać, chyba że jest to wymagane. Zwykle typujemy wskaźnik źródła na jego oryginalny typ.
Używamy głównie do pracy z bitami. Gdy jest używany dla wartości logicznych, wartości logiczne są konwertowane na wartości całkowite, tj. 1 dla prawdy i 0 dla fałszu.
Zobaczmy przykład obsady Reinterpret:
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
Wynik:
0x3ef3090
do
97
do
W powyższym przykładzie zadeklarowaliśmy wskaźnik całkowity ptr wskazujący na wartość 97. Następnie deklarujemy wskaźnik znakowy ch i rzutujemy na niego ptr za pomocą.
Następnie drukujemy różne wartości. Pierwsze, które drukujemy, to ptr, które wskazuje na liczbę całkowitą. Dlatego drukuje adres.
Następna wartość ch zawiera wartość 97 i dlatego wypisuje „a”, które jest odpowiednikiem 97 w ASCII. Następna wartość „* ptr” przechowuje wartość 97, podczas gdy „* ch” zawiera odpowiednik 97 w ASCII, tj. „A” podczas rzutowania przy użyciu plik reinterpret_cast.
# 4) Const Cast
Operator rzutowania służy do zmiany lub manipulowania stałością wskaźnika źródła. Przez manipulację rozumiemy, że można albo ustawić stałość na wskaźnik niebędący stałym, albo usunąć stałość ze wskaźnika stałej.
Warunkiem pomyślnego rzutowania operatora jest to, że wskaźnik i rzutowane źródło powinny być tego samego typu.
Weźmy przykład, aby to zrozumieć.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
W tym przykładzie widzimy, że funkcja „printVal” akceptuje wskaźnik inny niż stały. W funkcji głównej mamy stałą zmienną „wartość” przypisaną do wskaźnika stałej ptr.
Aby przekazać ten wskaźnik do funkcji printVal, rzucamy go, stosując w celu usunięcia stałej. Następnie przekazujemy wskaźnik ptr_cast do funkcji, aby uzyskać pożądane wyniki.
Wniosek
Tym sposobem zakończymy ten temat konwersji typów w C ++. Widzieliśmy już wszystko o niejawnych i jawnych konwersjach, które są używane w C ++.
Należy jednak mieć świadomość, że aby zapobiec utracie danych i innym tego typu trudnościom, konwersje lub typoszeregowanie należy stosować rozsądnie tylko wtedy, gdy sytuacja wymaga użycia.
=> Obejrzyj przewodnik szkoleniowy dla początkujących C ++ tutaj.
rekomendowane lektury
- Najlepsza DARMOWA seria samouczków języka C #: najlepszy przewodnik po języku C # dla początkujących
- Kwalifikatory typu i klasy pamięci w C ++
- Typy testów migracji: ze scenariuszami testów dla każdego typu
- Jak zdecydować, jaki rodzaj testów jest wymagany dla projektu? - Ręczne lub automatyczne
- Typy danych C ++
- Testowanie obciążenia za pomocą samouczków HP LoadRunner
- Zmienne w C ++
- Szablony w C ++ z przykładami