2009-10-22 2 views

ответ

161

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

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

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

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

+46

Единственными исключениями, которые могут выходить из строя во время выполнения, являются 'dynamic_cast'. –

+8

C++ reinterpret_cast (U) может выйти из строя во время выполнения почти так же, как при использовании стилей стиля C, и все они сильно отличаются от того, как не работает dynamic_cast (U). –

+11

˗1 normal C cast '(int) что-то' не может потерпеть неудачу - вы получаете трансляцию в int или ошибку компилятора. –

2

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

12

См. A comparison of the C++ casting operators.

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

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

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

129

Короче:

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

+9

Я думаю, что вместо «4-байтового указателя» вы имели в виду «указатель на 4-байтовый тип данных». – iheanyi

10
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! 
} 
+3

Не могли бы вы подробнее рассказать о своем ответе, добавив немного подробного описания вашего решения? – abarisone

+0

Я думаю, что ответ показывает, что «static_casts» проверяет преобразования типов, чтобы убедиться, что они находятся вдоль допустимых путей в графе иерархии. В этом конкретном примере допускается кастинг от A * до B * или B * до A *, поскольку A и B образуют путь в иерархическом графе. C * не находится на пути, поэтому static_cast выдаст ошибку времени компиляции. Sidenote: Возможно, стоит отметить, что при использовании от A * до B * NULL с динамическим_cast во время выполнения зависит от истинного базового объекта. –

2

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

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

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

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

1

Отличный пост объяснения различных забросы в C/C++, а также то, что C-стиль литья действительно: https://anteru.net/blog/2007/12/18/200/index.html

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

  1. const_cast
  2. static_cast
  3. static_cast с последующим const_cast
  4. reinterpret_cast
  5. reinterpret_castfollowed const_cast

 Смежные вопросы

  • Нет связанных вопросов^_^