W tej sekcji omówione zostanie rzutowanie typów zmiennych w języku programowania C++. Rzutowanie typów odnosi się do konwersji jednego typu danych na inny w programie. Typowanie można wykonać na dwa sposoby: automatycznie przez kompilator i ręcznie przez programistę lub użytkownika. Odlewanie typów jest również znane jako konwersja typów.
Załóżmy na przykład, że dane są typu całkowitego i chcemy je przekonwertować na typ zmiennoprzecinkowy. Musimy więc ręcznie rzutować dane int na typ float, a ten typ rzutowania nazywa się w C++ rzutowaniem typu.
int num = 5; float x; x = float(num); x = 5.0
2IIprzykład:
float num = 5.25; int x; x = int(num); Output: 5
Rzutowanie typów dzieli się na dwa typy: niejawna konwersja lub niejawne rzutowanie typów i jawna konwersja typów lub jawne rzutowanie typów.
Niejawne rzutowanie typu lub niejawna konwersja typu
- Nazywa się to automatycznym odlewaniem typu.
- Automatycznie konwertuje jeden typ danych na inny, bez żadnej interwencji zewnętrznej, takiej jak programista lub użytkownik. Oznacza to, że kompilator automatycznie konwertuje jeden typ danych na inny.
- Wszystkie typy danych są automatycznie aktualizowane do największego typu bez utraty jakichkolwiek informacji.
- Może mieć zastosowanie w programie tylko wtedy, gdy obie zmienne są ze sobą kompatybilne.
char - sort int -> int -> unsigned int -> long int -> float -> double -> long double, etc.
Uwaga: Niejawne rzutowanie typów powinno odbywać się z niskich na wyższe typy danych. W przeciwnym razie wpływa to na podstawowy typ danych, który może utracić precyzję lub dane, a kompilator może wyświetlić ostrzeżenie w tej sprawie.
Program do korzystania z ukrytego rzutowania typów w C++
Stwórzmy przykład demonstrujący rzutowanie jednej zmiennej na inną przy użyciu niejawnego rzutowania typu w C++.
#include using namespace std; int main () { short x = 200; int y; y = x; cout << ' Implicit Type Casting ' << endl; cout << ' The value of x: ' << x << endl; cout << ' The value of y: ' << y << endl; int num = 20; char ch = 'a'; int res = 20 + 'a'; cout << ' Type casting char to int data type ('a' to 20): ' << res << endl; float val = num + 'A'; cout << ' Type casting from int data to float type: ' << val << endl; return 0; }
Wyjście:
Implicit Type Casting The value of x: 200 The value of y: 200 Type casting char to int data type ('a' to 20): 117 Type casting from int data to float type: 85
W powyższym programie zadeklarowaliśmy zmienną typu krótkiego x na 200, a zmienną całkowitą y. Następnie przypisujemy wartość x do y, a następnie kompilator automatycznie konwertuje krótką wartość danych x na y, co zwraca y równe 200.
W kolejnych wyrażeniach zadeklarowaliśmy, że zmienna typu int num ma wartość 20, a zmienna typu znakowego ch to „a”, co jest równoważne wartości całkowitej równej 97. Następnie dodajemy te dwie zmienne, aby przeprowadzić niejawną konwersję, która zwraca wynik wyrażenia 117.
Podobnie w trzecim wyrażeniu dodajemy zmienną całkowitą num wynoszącą 20, a zmienną znakową ch wynosi 65, a następnie przypisujemy wynik do zmiennej float val. W ten sposób wynik wyrażenia jest automatycznie konwertowany przez kompilator na typ zmiennoprzecinkowy.
Jawne rzutowanie typu lub jawna konwersja typu
- Nazywa się to również ręcznym rzutowaniem typu w programie.
- Jest ręcznie rzutowany przez programistę lub użytkownika w celu zmiany jednego typu danych na inny w programie. Oznacza to, że użytkownik może łatwo rzutować jedne dane na inne, zgodnie z wymaganiami programu.
- Nie wymaga sprawdzania zgodności zmiennych.
- W tym rzutowaniu możemy uaktualnić lub obniżyć typ danych jednej zmiennej na inną w programie.
- Używa operatora rzutowania () do zmiany typu zmiennej.
Składnia jawnego rzutowania typu
(type) expression;
typ: Reprezentuje dane zdefiniowane przez użytkownika, które konwertują dane wyrażenie.
wyrażenie: Reprezentuje stałą wartość, zmienną lub wyrażenie, którego typ danych jest konwertowany.
Na przykład mamy liczbę zmiennoprzecinkową wynoszącą 4,534 i aby przekonwertować wartość całkowitą, należy zastosować instrukcję w postaci:
int num; num = (int) 4.534; // cast into int data type cout << num;
Po wykonaniu powyższych instrukcji wartość zmiennoprzecinkowa zostanie rzutowana na typ danych całkowitych za pomocą operatora rzutowania (). Wartość zmiennoprzecinkowa jest przypisana do liczby całkowitej, która obcina część dziesiętną i wyświetla tylko 4 jako wartość całkowitą.
Pete'a Davidsona
Program demonstrujący użycie jawnego rzutowania typów w C++
Stwórzmy prosty program rzutujący jedną zmienną typu na inny typ przy użyciu jawnego rzutowania typów w języku programowania C++.
#include using namespace std; int main () { // declaration of the variables int a, b; float res; a = 21; b = 5; cout << ' Implicit Type Casting: ' << endl; cout << ' Result: ' << a / b << endl; // it loses some information cout << ' Explicit Type Casting: ' << endl; // use cast () operator to convert int data to float res = (float) 21 / 5; cout << ' The value of float variable (res): ' << res << endl; return 0; }
Wyjście:
Implicit Type Casting: Result: 4 Explicit Type Casting: The value of float variable (res): 4.2
W powyższym programie bierzemy dwie zmienne całkowite, a i b, których wartości wynoszą 21 i 2. Następnie dzielimy a przez b (21/2), co zwraca wartość typu int 4.
W drugim wyrażeniu deklarujemy zmienną typu float res, która przechowuje wyniki a i b bez utraty danych, używając operatora rzutowania w metodzie rzutowania typu jawnego.
Program do rzutowania podwójnych danych na typ int i float za pomocą operatora rzutowania
Rozważmy przykład obliczania pola prostokąta poprzez rzutowanie podwójnych danych na typy zmiennoprzecinkowe i int w programowaniu w C++.
#include using namespace std; int main () { // declaration of the variables double l, b; int area; // convert double data type to int type cout << ' The length of the rectangle is: ' <> l; cout << ' The breadth of the rectangle is: ' <> b; area = (int) l * b; // cast into int type cout << ' The area of the rectangle is: ' << area << endl; float res; // convert double data type to float type cout << ' The length of the rectangle is: ' << l << endl; cout << ' The breadth of the rectangle is: ' << b << endl; res = (float) l * b; // cast into float type cout << ' The area of the rectangle is: ' << res; return 0; }
Wyjście:
The length of the rectangle is: 57.3456 The breadth of the rectangle is: 12.9874 The area of the rectangle is: 740 The length of the rectangle is: 57.3456 The breadth of the rectangle is: 12.9874 The area of the rectangle is: 744.77
Niektóre różne typy odlewania typu
W przypadku rzutowania typów istnieje operator rzutowania, który wymusza konwersję jednego typu danych na inny typ danych, zgodnie z potrzebami programu. C++ ma cztery różne typy operatora rzutowania:
- Statyczny_cast
- dynamic_cast
- const_cast
- reinterpretuj_cast
Obsada statyczna:
static_cast to proste rzutowanie w czasie kompilacji, które konwertuje lub rzutuje jeden typ danych na inny. Oznacza to, że w czasie wykonywania nie sprawdza typu danych, czy wykonane rzutowanie jest prawidłowe, czy nie. Dlatego programista lub użytkownik ma obowiązek upewnić się, że konwersja była bezpieczna i ważna.
static_cast ma wystarczające możliwości, aby wykonać wszystkie konwersje przeprowadzane przez niejawne rzutowanie. Wykonuje także konwersje pomiędzy wskaźnikami klas powiązanych ze sobą (upcast - > z klasy pochodnej do klasy bazowej lub downcast - > z klasy bazowej do klasy pochodnej).
Składnia rzutowania statycznego
static_cast (expression);
Program demonstrujący użycie obsady statycznej
Stwórzmy prosty przykład użycia statycznego rzutowania typu rzutowania w programowaniu w C++.
#include using namespace std; int main () { // declare a variable double l; l = 2.5 * 3.5 * 4.5; int tot; cout << ' Before using the static cast:' << endl; cout << ' The value of l = ' << l << endl; // use the static_cast to convert the data type tot = static_cast (l); cout << ' After using the static cast: ' << endl; cout << ' The value of tot = ' << tot << endl; return 0; }
Wyjście:
Before using the static cast: The value of l = 39.375 After using the static cast: The value of tot = 39
Dynamiczna obsada
dynamic_cast to operator rzutowania w czasie wykonywania używany do konwersji jednego typu zmiennej na inny tylko na wskaźnikach klas i referencjach. Oznacza to, że sprawdza prawidłowe rzutowanie zmiennych w czasie wykonywania, a jeśli rzutowanie nie powiedzie się, zwraca wartość NULL. Castowanie dynamiczne opiera się na mechanizmie RTTI (Runtime Type Identification).
Program demonstrujący użycie funkcji Dynamic Cast w C++
Stwórzmy prosty program do wykonania dynamic_cast w języku programowania C++.
#include using namespace std; class parent { public: virtual void print() { } }; class derived: public parent { }; int main () { // create an object ptr parent *ptr = new derived; // use the dynamic cast to convert class data derived* d = dynamic_cast (ptr); // check whether the dynamic cast is performed or not if ( d != NULL) { cout << ' Dynamic casting is done successfully'; } else { cout << ' Dynamic casting is not done successfully'; } }
Wyjście:
Dynamic casting is done successfully.
Reinterpretuj typ obsady
Rzutowanie typu reinterpret_cast służy do rzutowania wskaźnika na dowolny inny typ wskaźnika, niezależnie od tego, czy dany wskaźnik należy do siebie, czy nie. Oznacza to, że nie sprawdza, czy wskaźnik lub dane wskazywane przez wskaźnik są takie same, czy nie. Rzuca także wskaźnik na typ całkowity i odwrotnie.
Składnia typu reinterpret_cast
reinterpret_cast expression;
Program do korzystania z Reinterpretacji Cast w C++
Napiszmy program demonstrujący konwersję wskaźnika za pomocą reinterpretacji w języku C++.
#include using namespace std; int main () { // declaration of the pointer variables int *pt = new int (65); // use reinterpre_cast operator to type cast the pointer variables char *ch = reinterpret_cast (pt); cout << ' The value of pt: ' << pt << endl; cout << ' The value of ch: ' << ch << endl; // get value of the defined variable using pointer cout << ' The value of *ptr: ' << *pt << endl; cout << ' The value of *ch: ' << *ch << endl; return 0; }
Wyjście:
The value of pt: 0x5cfed0 The value of ch: A The value of *ptr: 65 The value of *ch: A
Obsada stała
const_cast służy do zmiany lub manipulowania stałym zachowaniem wskaźnika źródłowego. Oznacza to, że możemy wykonać const na dwa sposoby: ustawiając stały wskaźnik na wskaźnik inny niż stały lub usuwając lub usuwając const ze wskaźnika const.
Składnia typu Const Cast
const_cast exp;
Program do korzystania z Const Cast w C++
Java, jak przekonwertować ciąg na int
Napiszmy program, który będzie rzutował wskaźnik źródłowy na wskaźnik nierzucany, używając const_cast w C++.
#include using namespace std; // define a function int disp(int *pt) { return (*pt * 10); } int main () { // declare a const variable const int num = 50; const int *pt = # // get the address of num // use const_cast to chnage the constness of the source pointer int *ptr = const_cast (pt); cout << ' The value of ptr cast: ' << disp(ptr); return 0; }
Wyjście:
The value of ptr cast: 500