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?

Author: Ajay, 2009-10-22

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.

 175
Author: Glen,
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 :

  1. static_cast<>() daje możliwość sprawdzania czasu kompilacji, w stylu C Obsada Nie.
  2. 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.
  3. 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

 142
Author: Breeze,
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.

 13
Author: Eugene Yokota,
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!
}
 13
Author: Rishi Khaneja,
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.

 4
Author: octoback,
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ę?

 3
Author: Doug T.,
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)

  1. const_cast
  2. static_cast
  3. static_cast, po którym następuje const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed by const_cast
 2
Author: Ying Xiong,
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