В чем разница между static_cast <> и стилем стиля C?
Есть ли какая-то причина, чтобы предпочесть static_cast<>
над тем, чтобы стиль C был отличным? Они эквивалентны? Есть ли у них какая-либо разница в скорости?
Ответы
Ответ 1
Стили стиля С++ проверяются компилятором. Стили стиля C не выполняются и могут не работать во время выполнения
также можно легко выполнить поиск в стиле С++, в то время как очень сложно найти стили стиля c
Еще одно большое преимущество заключается в том, что четыре разных стиля С++ выражают намерение программиста более четко.
При написании С++ я бы почти всегда использовал С++ над стилем C.
Ответ 2
Короче говоря:
-
static_cast<>()
дает вам возможность проверки времени компиляции, C-Style cast не делает. -
static_cast<>()
более читабельна и может быть легко обнаружена в любом месте внутри C++ исходного кода, C_Style cast is'nt. - Намерения передаются гораздо лучше, используя 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++: Нажмите здесь
Ответ 3
См. Сравнение операторов каста С++.
Однако использование одного и того же синтаксиса для множества различных операций литья может сделать цель программиста неясной.
Кроме того, может быть трудно найти конкретный тип отливки в большой базе кода.
общность C-стиля может быть излишней для ситуаций, когда все, что необходимо, является простым преобразованием. Возможность выбора между несколькими различными операторами литья различной степени мощности может помешать программистам непреднамеренно отбрасывать неправильный тип.
Ответ 4
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!
}
Ответ 5
static_cast
проверяет во время компиляции, что преобразование не существует между явно несовместимыми типами. В отличие от dynamic_cast
, во время выполнения проверка совместимости типов не выполняется. Кроме того, преобразование static_cast
не обязательно безопасно.
static_cast
используется для преобразования из указателя в базовый класс в указатель на производный класс или между нативными типами, таких как enum to int или float to int.
Пользователь static_cast
должен убедиться, что преобразование безопасно.
Приведение в C-стиле не выполняет никакой проверки ни при компиляции, ни во время выполнения.
Ответ 6
Поскольку существует много разных видов кастинга с разными семантикой, static_cast < > позволяет вам сказать "Я делаю юридическое преобразование из одного типа в другой", например, из int в double. Простой стиль C-стиля может означать много чего. Вы поднимаете/опускаете? Вы переинтерпретируете указатель?
Ответ 7
Отличная статья, объясняющая разные роли в C/С++, и то, что действительно делает C-стиль: https://anteru.net/blog/2007/12/18/200/index.html
C-Style casting, используя синтаксис переменной типа (type). Худшее изобрел. Это делается в следующих порядке: (см. также С++ Standard, 5.4 expr.cast, пункт 5)
- const_cast
- static_cast
- static_cast, за которым следует const_cast
- reinterpret_cast
- reinterpret_castfollowed by const_cast