Відповіді:
Уривки стилів C ++ перевіряються компілятором. Касти в стилі C не є і можуть провалюватися під час виконання.
Крім того, касти в стилі c ++ можна легко знайти, тоді як шукати касти в стилі c дуже важко.
Ще одна велика перевага полягає в тому, що 4 різні титри стилів C ++ виразніше виражають наміри програміста.
При написанні C ++ я завжди завжди використовую C ++ над стилем C.
dynamic_cast
s.
(int)something
не може вийти з ладу - або ви потрапляєте до int, або помилка компілятора.
Коротше кажучи :
static_cast<>()
дає змогу перевіряти час компіляції, C-Style cast не робить.static_cast<>()
є більш читабельним і його легко помітити в будь-якому місці всередині вихідного коду C ++, C_Style cast is'nt.Більше пояснення :
Статичний формат виконує перетворення між сумісними типами . Він схожий на ролі в стилі С, але є більш обмежуючим. Наприклад, команда в стилі 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 ++ .
Однак використання одного і того ж синтаксису для різних операцій кастингу може зробити наміри програміста незрозумілими.
Крім того, у великій кодовій базі може бути важко знайти конкретний тип акторів.
загальність акторів у стилі С може бути надмірною для ситуацій, коли все, що потрібно, - це просто перетворення. Можливість вибору між декількома різними операторами кастингу різного ступеня потужності може перешкоджати програмістам ненавмисно виводити їх на неправильний тип.
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-Style, використовуючи синтаксис змінної (type). Найгірше, що коли-небудь винайдено. У такому порядку це намагається зробити наступні касти: (див. Також C ++ Standard, 5.4 expr.cast, пункт 5)
- const_cast
- static_cast
- static_cast, а потім const_cast
- reinterpret_cast
- повторно тлумачити_наведено далі const_cast
static_cast
перевіряє під час компіляції, що конверсія не знаходиться між очевидно несумісними типами. Навпаки dynamic_cast
, не перевіряється сумісність типів під час виконання. Також static_cast
конверсія не обов'язково є безпечною.
static_cast
використовується для перетворення від покажчика до базового класу до вказівника на похідний клас або між нативними типами, наприклад, enum to int або float to int.
Користувач static_cast
повинен переконатися, що конверсія є безпечною.
Артикул у стилі C не виконує жодної перевірки ні під час компіляції, ні під час виконання.