2008-08-28 16 views
27

вопрос, связанный с Regular cast vs. static_cast vs. dynamic_cast:C++ стилей синтаксиса литой

Что отливать стиль синтаксиса Вы займетесь в C++?

  • C-стиль синтаксиса ролях: (int)foo
  • C++ - стиль литая синтаксис: static_cast<int>(foo)
  • конструктор Синтаксис: int(foo)

Они не могут перевести точно такие же инструкции (они?) но их эффект должен быть одинаковым (правильно?).

Если вы просто набрасываете между встроенными числовыми типами, я считаю, что синтаксис синтаксиса в стиле C++ слишком многословный. Как бывший Java-кодер, я предпочитаю использовать синтаксис синтаксиса C-стиля, но мой местный гуру C++ настаивает на использовании синтаксиса конструктора.

Что вы думаете?

ответ

49

Это лучшая практика никогда использовать C-стиле бросает по трем основным причинам:

  • , как уже упоминалось, проверка не производится здесь. Программист просто не может знать, какая из различных отливок используется, которая ослабляет сильную типизацию. Новые броски намеренно визуально поражают. Поскольку броски часто обнаруживают слабость в коде, утверждается, что делать заметки в коде - это хорошо.
  • Это особенно верно при поиске отливок с помощью автоматизированного инструмента. Надежность C-стиля достоверно невозможна.

Как palm3D отметил:

Я считаю, C++ - синтаксис стиля литой слишком многословным.

Это намеренно по причинам, приведенным выше.

Конструктор синтаксиса (официальное название: функция стиля литая) семантически тот же в гипсе C-стиля и его следует избегать, а также (для переменных инициализаций на декларации, за исключением), по тем же причинам. Дискуссивно, должно ли это быть истинным даже для типов, которые определяют пользовательские конструкторы, но в Effective C++, Майерс утверждает, что даже в тех случаях вы должны воздерживаться от их использования. Для иллюстрации:

void f(auto_ptr<int> x); 

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD 
f(auto_ptr<int>(new int(5));    // BAD 

static_cast здесь будет на самом деле вызвать auto_ptr конструктор.

+9

Интересно, сколько раз вы искали бросок в своем коде с помощью автоматизированный инструмент ... – Blindy 2010-12-05 05:08:53

+2

@Blindly: бывает. Я уже это сделал. Помните, что в C++, в отличие от некоторых других языков (Java, C#), вы обычно можете программировать без трансляции. Каждый явный приведение в ваш код является потенциальным недостатком дизайна. Идентификация бросков в вашем коде на C++ является важным шагом в рефакторинге. В C# было бы, конечно, смешно искать броски в коде - они везде! – 2010-12-05 10:30:17

1

Синтаксис синтаксиса C-стиля, не проверяйте ошибку. Синтаксис синтаксиса в стиле Си ++, делает некоторые проверки. При использовании static_cast, даже если он не выполняет проверку, по крайней мере вы знаете, что вам следует быть осторожным здесь.

+1

`static_cast` всегда проверяет совместимость источника и назначения. (Он не может защитить пользователей от их ошибки, если они преобразуют базу в производный тип, которого у нее на самом деле нет, но это их вина.) – 2017-05-12 23:42:16

11

По Stroustrup:

«Новый стиль слепков» были введены , чтобы дать программистам возможность заявить о своих намерениях более четко и для компилятор, чтобы поймать больше ошибок.

Таким образом, это безопасно, поскольку оно обеспечивает дополнительную проверку времени компиляции.

1

C-style cast - самый худший путь. Это труднее увидеть, непогрешимым, объединяет различные действия, которые не должны быть объединены, и не может делать все, что может сделать C++-стиль. Они действительно должны были удалить C-стиль приведения из языка.

1

Я использую static_cast по двум причинам.

  1. Совершенно ясно, что происходит. Я не могу прочитать это, не понимая, что происходит бросок. С эффектами C-стиля вы можете пройти прямо над ним без паузы.
  2. Легко искать любое место в моем коде, где я качаю.
2

Определенно C++ - стиль. Дополнительная набивка поможет вам избежать кастинга, если вы этого не сделаете :-)

5

Что касается этой темы, я следую рекомендациям Scott Meyers (More Effective C++, пункт 2: Привилегии C++).

Я согласен с тем, что приведение стилей в стиле C++ многословно, но это то, что мне нравится в них: их очень легко обнаружить, и они упрощают чтение кода (что более важно, чем писать).

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

1

В настоящее время мы используем C-style casts везде. Я спросил у другого casting question, и теперь я вижу преимущество использования static_cast вместо этого, если не по какой-либо другой причине, чем «greppable» (мне нравится этот термин). Я, вероятно, начну использовать это.

Мне не нравится стиль C++; это слишком похоже на вызов функции.

1

Перейти к стилю C++ и, в худшем случае, уродливые подробные фрагменты кода, которые содержат явный тип вывода C++, будут постоянным напоминанием о том, что все мы знаем (т. Е. Явное кастинг - это плохо), что приводит к мошенничеству с ругательствами). Не ходите с стилем C++, если хотите овладеть искусством отслеживания ошибок времени выполнения.

1

Синтаксис конструктора. C++ - OO, существуют конструкторы, я их использую. Если вы чувствуете необходимость комментировать эти преобразования ctor, вы должны делать это для каждого типа, а не только для встроенных. Возможно, вы используете ключевое слово «явное» для конверсий, но синтаксис клиента имитирует то, что делает синтаксис ctor для встроенных типов. Будучи greppable, это может быть правдой, но то, что большой сюрприз, что печатать больше символов делает поиск простым. Зачем относиться к ним как к особым? Если вы пишете математические формулы с большим количеством int/unsigned/... в/из double/float - graphics - и вам нужно писать static_cast каждый раз, внешний вид формулы захламляется и очень нечитабелен. И это тяжелая битва, так как много раз вы будете конвертировать, даже не заметив, что вы есть. Для указателей downcasting я использую static_cast, поскольку, по умолчанию, по умолчанию это не существует.