Вопрос

Вопрос, связанный с Обычный актерский состав противstatic_cast противdynamic_cast (динамическая передача):

Какой стиль приведенного синтаксиса вы предпочитаете в C ++?

  • Синтаксис приведения в стиле C: (int)foo
  • Синтаксис приведения в стиле C ++: static_cast<int>(foo)
  • синтаксис конструктора: int(foo)

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

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

А ты как думаешь?

Это было полезно?

Решение

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

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

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

Я нахожу синтаксис приведения в стиле C ++ слишком многословным.

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

Синтаксис конструктора (официальное название:приведение в функциональном стиле) семантически тот же самый как приведение в стиле C, и его также следует избегать (за исключением инициализации переменных при объявлении), по тем же причинам.Спорно, должно ли это быть верно даже для типов, которые определяют пользовательские конструкторы, но в эффективном 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 конструктор.

Другие советы

Согласно Страуструп:

Были введены "приведения в новом стиле" чтобы дать программистам возможность более четко сформулировать свои намерения и чтобы компилятор отлавливал больше ошибок.

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

Что касается этого вопроса, я следую рекомендациям, сделанным Скотт Мейерс (Более эффективный C ++, Пункт 2 :Предпочитаю приведения в стиле C ++).

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

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

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

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

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

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

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

В настоящее время мы повсеместно используем приведения в стиле C.Спросил я другого вопрос о кастинге, и теперь я вижу преимущество использования static_cast вместо этого, хотя бы по той простой причине, что это "greppable" (мне нравится этот термин).Вероятно, я начну использовать это.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top