В чем разница между static_cast и стилем стиля C?

Есть ли причина предпочесть static_cast над стилем стиля C? Они эквивалентны? Есть ли разница в скорости?

    Стили стиля C ++ проверяются компилятором. Стили стиля C не могут и могут не работать во время выполнения

    Кроме того, приведения в стиле c ++ можно легко искать, тогда как очень сложно искать стили стиля c

    Еще одно большое преимущество заключается в том, что четыре разных стиля C ++ выражают намерение программиста более четко.

    При написании C ++ я бы почти всегда использовал C ++ в стиле C.

    Короче говоря :

    1. static_cast<>() дает вам возможность проверки времени компиляции, C-Style cast не делает.
    2. static_cast<>() более читабельна и может быть легко обнаружена в любом месте исходного кода C ++, C_Style cast is’nt.
    3. Намерения передаются гораздо лучше, используя C ++ cast.

    Подробнее Объяснение :

    Статический кастинг выполняет преобразования между совместимыми типами . Он похож на C-стиль, но более ограничительный. Например, приведение в стиле C позволит целочисленному указателю указывать на символ.

     char c = 10; // 1 byte int *p = (int*)&c; // 4 bytes 

    Поскольку это приводит к 4-байтовому указателю (указателю на 4-байтовый тип данных), указывающему на 1 байт выделенной памяти, запись на этот указатель приведет либо к ошибке во время выполнения, либо перезапишет некоторую смежную память.

     *p = 5; // run-time error: stack corruption 

    В отличие от приведения в стиле C статический бросок позволит компилятору проверить совместимость типов данных указателя и указателя, что позволяет программисту поймать это неправильное назначение указателя во время компиляции.

     int *q = static_cast(&c); // compile-time error 

    Вы также можете проверить эту страницу на более подробные сведения о C ++-трансляциях: Нажмите здесь

    См . Сравнение операторов литья C ++ .

    Однако использование одного и того же синтаксиса для различных операций литья может сделать цель программиста неясной.

    Кроме того, может быть трудно найти конкретный тип литья в большой кодовой базе.

    общность стилей C-стиля может быть чрезмерной для ситуаций, когда все, что необходимо, – это простое преобразование. Возможность выбора между несколькими различными операторами кастингов различной степени мощности может помешать программистам непреднамеренно привести к неправильному типу.

     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(&i); ERROR! SMART! A* b = new B; B* b2 = static_cast(b); // NO ERROR! SMART! C* c = (C*)(b); // NO ERROR! FAIL! //C* c = static_cast(b); ERROR! SMART! } 

    static_cast проверяет во время компиляции, что преобразование не существует между явно несовместимыми типами. В отличие от dynamic_cast , во время выполнения проверка совместимости типов не выполняется. Кроме того, преобразование static_cast не обязательно безопасно.

    static_cast используется для преобразования из указателя в базовый class в указатель на производный class или между нативными типами, таких как enum to int или float to int.

    Пользователь static_cast должен убедиться, что преобразование безопасно.

    Приведение в стиле C не выполняет никакой проверки ни при компиляции, ни во время выполнения.

    Поскольку существует много разных типов кастинга с разными семантическими выражениями, static_cast <> позволяет вам сказать «Я делаю юридическое преобразование из одного типа в другой», например, из int в double. Простой стиль C-стиля может означать много чего. Вы поднимаете / опускаете? Вы переинтерпретируете указатель?

    Отличная статья, объясняющая разные роли в C / C ++, и то, что действительно делает C-стиль: https://anteru.net/blog/2007/12/18/200/index.html

    C-Style casting, используя синтаксис переменной типа (type). Самое худшее когда-либо изобретенное. Он пытается выполнить следующие действия в следующем порядке: (см. Также C ++ Standard, 5.4 expr.cast, пункт 5)

    1. const_cast
    2. static_cast
    3. static_cast, за которым следует const_cast
    4. reinterpret_cast
    5. reinterpret_castfollowed от const_cast
    Давайте будем гением компьютера.