Świetna robota, że dotarłeś tak daleko. Standardowe reguły konwersji są dość złożone — nie martw się, jeśli nie rozumiesz każdego niuansu.
Przegląd rozdziału
Proces konwersji wartości z jednego typu danych na inny nazywa się a konwersja typu.
Niejawna konwersja typu (tzw automatyczna konwersja typów lub przymus) jest wykonywana zawsze, gdy oczekiwany jest jeden typ danych, ale dostarczany jest inny typ danych. Jeśli kompilator będzie w stanie dowiedzieć się, jak przeprowadzić konwersję między dwoma typami, tak się stanie. Jeśli nie wie, jak to zrobić, zakończy się niepowodzeniem z powodu błędu kompilacji.
Język C++ definiuje szereg wbudowanych konwersji pomiędzy swoimi podstawowymi typami (a także kilka konwersji dla bardziej zaawansowanych typów) zwanych standardowe konwersje. Należą do nich promocje liczbowe, konwersje liczbowe i konwersje arytmetyczne.
A promocja numeryczna to konwersja niektórych mniejszych typów liczbowych na pewne większe typy liczbowe (zwykle int lub double), dzięki czemu procesor może operować na danych odpowiadających naturalnemu rozmiarowi danych procesora. Promocje liczbowe obejmują zarówno promocje integralne, jak i promocje zmiennoprzecinkowe. Promocje numeryczne są zachowujące wartość, co oznacza, że nie następuje utrata wartości ani precyzji. Nie wszystkie konwersje poszerzające są promocjami.
A konwersja numeryczna to konwersja typów pomiędzy typami podstawowymi, która nie jest promocją numeryczną. A zawężająca konwersja to konwersja numeryczna, która może skutkować utratą wartości lub precyzji.
W C++ niektóre operatory binarne wymagają, aby ich operandy były tego samego typu. Jeśli podano operandy różnych typów, jeden lub oba operandy zostaną niejawnie przekonwertowane na pasujące typy przy użyciu zestawu reguł nazywanych zwykłymi konwersjami arytmetycznymi.
Jawna konwersja typu jest wykonywana, gdy programista jawnie żąda konwersji poprzez rzutowanie. A rzucać reprezentuje żądanie programisty dotyczące jawnej konwersji typu. C++ obsługuje 5 typów rzutowania: C-style casts, static casts, const casts, dynamic casts, I reinterpret casts. Generalnie należy unikać C-style casts, const casts, I reinterpret casts. static_cast służy do konwertowania wartości z jednego typu na wartość innego typu i jest zdecydowanie najczęściej używanym rzutowaniem w C++.
Definicje typów i wpisz aliasy pozwolić programiście na utworzenie aliasu dla typu danych. Aliasy te nie są nowymi typami i działają identycznie jak typ aliasowany. Typedefs i aliasy typów nie zapewniają żadnego rodzaju bezpieczeństwa typów i należy zachować ostrożność, aby nie zakładać, że alias jest inny niż typ, który aliasuje.
Klasa automatyczny słowo kluczowe ma wiele zastosowań. Po pierwsze, można zastosować auto odliczenie typu (tzw wnioskowanie typu), który wydedukuje typ zmiennej z jej inicjatora. Wpisz deduction, usuwa const i referencje, więc pamiętaj, aby dodać je z powrotem, jeśli chcesz.
Auto może być również użyte jako typ zwracany przez funkcję, aby kompilator wywnioskował typ zwracany przez funkcję na podstawie instrukcji zwrotnych funkcji, chociaż należy tego unikać w przypadku normalnych funkcji. Auto jest używane jako część końcowa składnia powrotu.
Czas quizu
Pytanie nr 1
Jaki rodzaj konwersji ma miejsce w każdym z poniższych przypadków? Prawidłowe odpowiedzi to: Nie jest wymagana żadna konwersja, promocja liczbowa, konwersja liczbowa, nie zostanie skompilowana z powodu zawężającej się konwersji. Przypuszczać int i long oba mają 4 bajty.
int main()
{
int a { 5 }; // 1a
int b { 'a' }; // 1b
int c { 5.4 }; // 1c
int d { true }; // 1d
int e { static_cast<int>(5.4) }; // 1e
double f { 5.0f }; // 1f
double g { 5 }; // 1g
// Extra credit section
long h { 5 }; // 1h
float i { f }; // 1i (uses previously defined variable f)
float j { 5.0 }; // 1j
}Pytanie nr 2
2a) Zaktualizuj następujący program, aby używał aliasów typów dla wartości stopni i radianów:
#include <iostream>
namespace constants
{
constexpr double pi { 3.14159 };
}
double convertToRadians(double degrees)
{
return degrees * constants::pi / 180;
}
int main()
{
std::cout << "Enter a number of degrees: ";
double degrees{};
std::cin >> degrees;
double radians { convertToRadians(degrees) };
std::cout << degrees << " degrees is " << radians << " radians.\n";
return 0;
}2b) Biorąc pod uwagę definicje degrees i radians w poprzednim rozwiązaniu quizu, wyjaśnij, dlaczego poniższa instrukcja zostanie skompilowana lub nie:
radians = degrees;
