Jaka jest różnica między static cast< > a c style casting?
Czy Jest jakiś powód, aby preferować static_cast<>
zamiast castingu w stylu C? Czy są równoważne? Czy to jakaś różnica prędkości?
7 answers
Odlewy w stylu C++ są sprawdzane przez kompilator. Odlewy w stylu C nie są i mogą zawieść w czasie wykonywania
Również odlewy w stylu c++ można łatwo wyszukiwać, podczas gdy naprawdę trudno jest szukać odlewów w stylu c
Kolejną dużą korzyścią jest to, że 4 różne odlewy w stylu C++ wyraźniej wyrażają intencje programisty.
Kiedy pisałem C++, prawie zawsze używałem tych C++ zamiast stylu C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 18:52:04
W skrócie :
-
static_cast<>()
daje możliwość sprawdzania czasu kompilacji, w stylu C Obsada Nie. -
static_cast<>()
jest bardziej czytelny i można go łatwo zauważyć gdziekolwiek wewnątrz kodu źródłowego C++, c_style cast jest ' NT. - intencje są znacznie lepiej przekazywane za pomocą C++.
Więcej Wyjaśnień :
Static cast wykonuje konwersje pomiędzy kompatybilnymi typami . Jest podobny do obsady w stylu C, ale jest bardziej restrykcyjny. Na przykład, odlew w stylu C pozwala na wskazanie wskaźnika integer na znak.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Ponieważ powoduje to 4-bajtowy wskaźnik (wskaźnik do 4-bajtowego typu danych) wskazujący na 1 bajt przydzielonej pamięci, zapis do tego wskaźnika spowoduje błąd w czasie wykonywania lub nadpisze jakąś sąsiednią pamięć.
*p = 5; // run-time error: stack corruption
W przeciwieństwie do c-style cast, statyczny cast pozwoli kompilatorowi sprawdzić, czy typy danych pointer i pointee są zgodne, co pozwala programiście złapać to niepoprawne przypisanie wskaźnika podczas kompilacji.
int *q = static_cast<int*>(&c); // compile-time error
Możesz również sprawdzić tę stronę na więcej wyjaśnień na temat C++: Kliknij tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-08 19:28:10
Zobacz porównanie operatorów C++ .
Jednak używanie tej samej składni dla różnych operacji odlewania może sprawić, że intencje programisty będą niejasne.
Ponadto trudno jest znaleźć konkretny typ obsady w dużej bazie kodowej.
Ogólność odlewu w stylu C może być przesadą w sytuacjach, w których wszystko, co jest potrzebne, to prosta konwersja. Możliwość wyboru pomiędzy kilkoma różnymi rzutami operatorzy o różnych stopniach mocy mogą uniemożliwić programistom przypadkowe przerzucenie na nieprawidłowy typ.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 18:41:36
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!
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 11:10:26
static_cast
sprawdza w czasie kompilacji, czy konwersja nie jest między typami wyraźnie niekompatybilnymi. W przeciwieństwie do dynamic_cast
, nie sprawdza się zgodności typów w czasie uruchamiania. Również konwersja static_cast
niekoniecznie jest Bezpieczna.
static_cast
jest używany do konwersji ze wskaźnika do klasy bazowej do wskaźnika do klasy pochodnej lub między natywnymi typami, takimi jak enum do int lub float do int.
Użytkownik static_cast
musi upewnić się, że konwersja jest Bezpieczna.
Obsada w stylu C nie wykonuje żadnych sprawdź, w czasie kompilacji lub w czasie wykonywania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-01 08:19:09
Ponieważ istnieje wiele różnych rodzajów odlewania, każdy z inną semantyką, static_cast pozwala ci powiedzieć "robię legalną konwersję z jednego typu do drugiego", jak z int do double. Prosta Obsada w stylu C może oznaczać wiele rzeczy. Rzucasz w górę/w dół? Reinterpretujesz wskazówkę?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 18:40:48
Świetny post wyjaśniający różne odlewy w C / C++ i co tak naprawdę robi c-style cast: https://anteru.net/blog/2007/12/18/200/index.html
Odlewanie w stylu C, używając składni zmiennej (type). The worst ever wynaleziony. Stara się wykonać następujące rzuty, w tej kolejności: (zobacz również C++ Standard, 5.4 expr.cast paragraf 5)
- const_cast
- static_cast
- static_cast, po którym następuje const_cast
- reinterpret_cast
- reinterpret_castfollowed by const_cast
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 19:23:58