Есть ли вред, если я не делаю const_castи просто использовать (char *) Typecasting? - PullRequest
0 голосов
/ 14 февраля 2012

Просто хочу узнать, есть ли недостаток в том, что вы не используете const_cast при передаче char * и просто приводите его к типу как (char *), или оба в основном одно и то же?

  #include <iostream>
  #include<conio.h>
  using namespace std;

  void print(char * str)
  {
    cout << str << endl;
  }

  int main () 
  {
     const char * c = "sample text";
    //  print( const_cast<char *> (c) ); // This one is advantageous or the below one
     print((char *) (c) );               // Does the above one and this are same? 
    getch();
    return 0;
  }

есть какой-то недостаток использования print((char *) (c) ); над print( const_cast<char *> (c) ); или в принципе оба одинаковы?

Ответы [ 5 ]

8 голосов
/ 14 февраля 2012

Прежде всего, ваша функция print должна принимать параметр const char* вместо просто char*, поскольку она не изменяет его.Это устраняет необходимость в любом приведении.

Что касается вашего вопроса, приведение типов в C ++ (т. Е. const_cast, dynamic_cast и т. Д.) Предпочтительнее приведений в стиле C, поскольку они выражают намерение приведенияи их легко искать.Если я случайно использую переменную типа int вместо const char*, использование const_cast приведет к ошибке времени компиляции.Однако, если я использую приведение в стиле C, оно будет успешно скомпилировано, но возникнет ряд трудностей для диагностики проблем с памятью во время выполнения.

5 голосов
/ 14 февраля 2012

В этом контексте они идентичны (приведение от "const char *" к "char *"). Преимущества const_cast:

  1. Это поможет поймать опечатки (если вы случайно приведете «const wchar_t *» к «char *», тогда const_cast будет жаловаться.)
  2. Поиск проще.
  3. Это легче увидеть.
4 голосов
/ 14 февраля 2012

Приведение в стиле C (char *) эквивалентно при правильном использовании .Если вы испортили const_cast, компилятор предупредит вас, если вы испортите приведение в стиле C, вы просто получите ошибку.

3 голосов
/ 14 февраля 2012

const_cast более уместно, потому что он только отбрасывает константу, и в противном случае предупредит вас о других возможных ошибках (например, преобразование одного типа указателя в другой и т. Д.), А (char *) будет просто молча интерпретировать все, что вы дадите ему, как char *.Так что, если вы можете - лучше используйте const_cast для лучшей безопасности типов.

1 голос
/ 15 февраля 2012

Независимо от того, какой эффект оказывают C cast в данном конкретном случае, C C cast и C ++ не одинаковы: C ++ различает переинтерпретацию, статическое, динамическое и константное приведение.

Семантика этих приведений различна и не всегда одинаково возможна.

C приведение может быть статическим или переосмысленным приведением (где статическое невозможно). Его следует использовать, когда такая амбивалентность является требованием (я не могу себе представить, как и когда), его следует избегать, когда необходимо четко определенное и ожидаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...