Odpowiedzi:
Rzutowania w stylu C ++ są sprawdzane przez kompilator. Rzutowania w stylu C nie są i mogą zawieść w czasie wykonywania.
Ponadto rzutowania w stylu c ++ mogą być łatwo wyszukiwane, podczas gdy naprawdę trudno jest znaleźć rzutowania w stylu c.
Kolejną dużą zaletą jest to, że 4 różne odlewy w stylu C ++ wyraźniej wyrażają zamiary programisty.
Pisząc C ++, prawie zawsze używam C ++ zamiast stylu C.
dynamic_cast
s.
(int)something
nie może zakończyć się niepowodzeniem - albo pojawi się błąd int lub błąd kompilatora.
W skrócie :
static_cast<>()
daje możliwość sprawdzania czasu kompilacji, nie obsługuje rzutów w stylu C.static_cast<>()
jest bardziej czytelny i można go łatwo zauważyć w dowolnym miejscu kodu źródłowego C ++, rzutowanie C_Style nie jest.Więcej wyjaśnień :
Obsada statyczna wykonuje konwersje między zgodnymi typami . Jest podobny do obsady w stylu C, ale jest bardziej restrykcyjny. Na przykład rzutowanie w stylu C umożliwia wskaźnikowi całkowitemu wskazywanie znaku.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Ponieważ skutkuje to 4-bajtowym wskaźnikiem (wskaźnikiem do 4-bajtowego typu danych) wskazującym na 1 bajt przydzielonej pamięci, zapis do tego wskaźnika spowoduje błąd w czasie wykonywania lub zastąpi przyległą pamięć.
*p = 5; // run-time error: stack corruption
W przeciwieństwie do rzutowania w stylu C, rzutowanie statyczne pozwoli kompilatorowi sprawdzić, czy typy danych wskaźnika i pointee są kompatybilne, co pozwala programiście wychwycić to nieprawidłowe przypisanie wskaźnika podczas kompilacji.
int *q = static_cast<int*>(&c); // compile-time error
Możesz także sprawdzić tę stronę, aby uzyskać więcej informacji na temat rzutowań w C ++: Kliknij tutaj
Zobacz Porównanie operatorów rzutujących w C ++ .
Jednak użycie tej samej składni do różnych operacji rzutowania może spowodować, że intencje programisty są niejasne.
Ponadto znalezienie konkretnego typu obsady w dużej bazie kodu może być trudne.
ogólność obsady w stylu C może być przesadna w sytuacjach, w których wszystko, czego potrzeba, to prosta konwersja. Możliwość wyboru między kilkoma różnymi operatorami odlewania o różnym stopniu mocy może uniemożliwić programistom nieumyślne rzutowanie na niewłaściwy typ.
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
Świetny post wyjaśniający różne obsady w C / C ++ i co naprawdę robi obsada w stylu C: https://anteru.net/blog/2007/12/18/200/index.html
Odlewanie w stylu C, przy użyciu składni zmiennej (typ). Najgorsze, jakie kiedykolwiek wymyślono. Próbuje to wykonać następujące rzutowania, w tej kolejności: (patrz także C ++ Standard, 5.4 expr.cast akapit 5)
- const_cast
- static_cast
- static_cast, po którym następuje const_cast
- reinterpret_cast
- reinterpret_cast obserwowane przez const_cast
static_cast
sprawdza w czasie kompilacji, czy konwersja nie jest między oczywiście niekompatybilnymi typami. W przeciwieństwie do tego dynamic_cast
, sprawdzanie zgodności typów nie jest wykonywane w czasie wykonywania. Ponadto static_cast
konwersja niekoniecznie jest bezpieczna.
static_cast
służy do konwersji ze wskaźnika na klasę podstawową na wskaźnik na klasę pochodną lub między typami rodzimymi, takimi jak enum na int lub float na int.
Użytkownik static_cast
musi upewnić się, że konwersja jest bezpieczna.
Rzutowanie w stylu C nie wykonuje żadnej kontroli ani podczas kompilacji, ani w czasie wykonywania.
Ponieważ istnieje wiele różnych rodzajów rzutowania, z których każdy ma inną semantykę, static_cast <> pozwala powiedzieć „Robię legalną konwersję z jednego typu na inny”, np. Z int na double. Zwykła obsada w stylu C może oznaczać wiele rzeczy. Czy rzucasz w górę / w dół? Czy reinterpretujesz wskaźnik?