Есть ли причины, чтобы предпочесть static_cast<>
более C стиль литья? Они эквивалентны? Есть ли разница в скорости?В чем разница между static_cast <> и стилем стиля C?
ответ
Стили стиля C++ проверяются компилятором. слепки типа C не являются и могут не во время выполнения
также, C++ забросы типа можно искать легко, в то время как на самом деле трудно найти гр стиля бросает
Другим большим преимуществом является то, что стиль 4 отличается C++ броски выражают намерение программиста более четко.
При написании C++ я бы почти всегда использовал C++ в стиле C.
Единственными исключениями, которые могут выходить из строя во время выполнения, являются 'dynamic_cast'. –
C++ reinterpret_cast
˗1 normal C cast '(int) что-то' не может потерпеть неудачу - вы получаете трансляцию в int или ошибку компилятора. –
Поскольку существует множество различных видов кастинга с различной семантикой, static_cast <> позволяет вам сказать: «Я делаю юридическое преобразование из одного типа в другой», например, из int в double. Простой стиль C-стиля может означать много чего. Вы поднимаете/опускаете? Вы переинтерпретируете указатель?
См. A comparison of the C++ casting operators.
Однако, использование того же синтаксиса для различных операций литья может сделать цель программиста неясной.
Кроме того, может быть трудно найти определенный тип отливок в большой кодовой базе.
Общность стилей C-стиля может быть чрезмерной для ситуаций, когда все, что необходимо, является простым преобразованием. Возможность выбора между несколькими различными операторами кастингов различной степени мощности может помешать программистам непреднамеренно привести к неправильному типу.
Короче:
static_cast<>()
дает время компиляции возможность проверки, C-Style бросок не делает.static_cast<>()
более читабельна и может быть легко обнаружена в любом месте исходного кода C++, C_Style cast is'nt.- Намерения передаются гораздо лучше с использованием C++-трансляций.
Подробнее Объяснение:
Статический бросок выполняет преобразование между совместимыми типами. Он похож на C-стиль, но более ограничительный. Например, приведение в стиле C позволит целочисленному указателю указывать на символ.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Так как это приводит к 4-байтовой типа данных, указывающий на 1 байт выделенной памяти, запись в этот указатель будет либо вызвать ошибку во время выполнения или перезаписывает некоторые смежную память.
*p = 5; // run-time error: stack corruption
В отличии от литого C-стиль, статический бросок позволит компилятору проверить, что типы данных указателей и pointee совместимы, что позволяет программисту поймать это неправильное назначение указателя во время компиляции.
int *q = static_cast<int*>(&c); // compile-time error
Вы также можете проверить эту страницу на более подробном объяснение на C++ бросает: Click Here
Я думаю, что вместо «4-байтового указателя» вы имели в виду «указатель на 4-байтовый тип данных». – iheanyi
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!
}
Не могли бы вы подробнее рассказать о своем ответе, добавив немного подробного описания вашего решения? – abarisone
Я думаю, что ответ показывает, что «static_casts» проверяет преобразования типов, чтобы убедиться, что они находятся вдоль допустимых путей в графе иерархии. В этом конкретном примере допускается кастинг от A * до B * или B * до A *, поскольку A и B образуют путь в иерархическом графе. C * не находится на пути, поэтому static_cast выдаст ошибку времени компиляции. Sidenote: Возможно, стоит отметить, что при использовании от A * до B * NULL с динамическим_cast во время выполнения зависит от истинного базового объекта. –
static_cast
проверки во время компиляции, что преобразование не между явно несовместимыми типами. В отличие от dynamic_cast
, проверка на совместимость типов не выполняется во время выполнения. Кроме того, преобразование static_cast
не обязательно безопасно.
static_cast
предназначен для преобразования из указателя в базовый класс в указатель на производный класс или между нативными типами, например enum to int или float to int.
Пользователь static_cast
должен убедиться, что преобразование безопасно.
Листинг C-стиля не выполняет никаких проверок ни при компиляции, ни во время выполнения.
Отличный пост объяснения различных забросы в C/C++, а также то, что C-стиль литья действительно: https://anteru.net/blog/2007/12/18/200/index.html
отливку C-Style, используя (тип) переменной синтаксис. Самое худшее из когда-либо созданных . Это пытается сделать следующие забросы, в следующем порядке: (см также стандарт C++, 5,4 expr.cast пункт 5)
- const_cast
- static_cast
- static_cast с последующим const_cast
- reinterpret_cast
- reinterpret_castfollowed const_cast
Связанный: http: // stackover flow.com/questions/103512/in-c-why-use-static-castintx-instead-of-intx – Flow