В чем разница между static_cast <> и кастом в стиле C? - PullRequest
174 голосов
/ 22 октября 2009

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

Ответы [ 7 ]

194 голосов
/ 22 октября 2009

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

также, можно легко найти приведение в стиле c ++, тогда как поиск приведений в стиле c действительно затруднен

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

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

158 голосов
/ 24 августа 2013

Короче :

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

Больше объяснений :

Статическое приведение выполняет преобразования между совместимыми типами . Это похоже на приведение в стиле 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<int*>(&c); // compile-time error

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

15 голосов
/ 16 апреля 2015
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!
}
15 голосов
/ 22 октября 2009

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

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

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

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

5 голосов
/ 01 мая 2015

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

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

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

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

4 голосов
/ 15 декабря 2017

Отличный пост, объясняющий различные приведения в C / C ++ и что на самом деле делает приведение в стиле C:

Приведение в стиле C с использованием синтаксиса переменной (type). Худшее когда-либо изобрел. Это попытается выполнить следующие приведения в следующем порядке: (см. также стандарт C ++, пункт 5 5.4 expr.cast

  1. const_cast
  2. static_cast
  3. static_cast с последующим const_cast
  4. reinterpret_cast
  5. reinterpret_cast следует за const_cast
4 голосов
/ 22 октября 2009

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

...