如果我不做const_cast<char*>而简单地使用(char *)类型转换有什么害处吗?



只想知道在传递char*并简单地将其类型转换为(char*)时不使用const_cast是否有缺点,或者两者基本上相同?

  #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( const_cast<char *> (c) );相比,使用print((char *) (c) );是否有一些缺点,或者两者基本相同?

首先,您的print函数应该采用const char*参数,而不仅仅是char*,因为它不会修改它。这就不需要任何强制转换。

至于您的问题,C++风格的强制转换(即const_castdynamic_cast等)比C风格的强制类型转换更受欢迎,因为它们表达了强制类型转换的意图,并且易于搜索。如果我意外地使用了int而不是const char*类型的变量,那么使用const_cast将导致编译时错误。然而,如果我使用C样式转换,它将成功编译,但在运行时会产生一些难以诊断的内存问题。

在这种情况下,它们是相同的(从"const char*"转换为"char*")。const_cast的优点是:

  1. 它将有助于发现拼写错误(如果您不小心将"const wchar_t*"转换为"char*",那么const_cast就会抱怨。)
  2. 搜索起来更容易
  3. 它更容易看到

如果使用得当,C样式转换(char *)等效于。如果你把const_cast搞砸了,编译器会警告你,如果你把C风格的转换搞砸了你就会得到一个错误。

const_cast更合适,因为它只会抛出常量,否则会警告您其他可能的错误(如将一种指针类型转换为另一种等),而(char *)只会默默地将您给它的任何内容解释为char *。因此,如果你能更好地使用const_cast,以获得更好的类型安全性。

与C强制转换在这种特殊情况下的效果无关,C强制转换和C++强制转换并不相同:C++区分重新解释、静态、动态和常量强制转换。

这些强制转换的语义是不同的,并不总是同样可能。

C强制转换可以是静态的,也可以是重新解释强制转换(在不可能是静态的情况下)。它必须用于需要这种矛盾心理的地方(我无法想象如何以及何时),必须避免用于需要明确定义和预期行为的地方。

最新更新