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