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

时间:2012-02-14 19:43:14

标签: c++ c++11

只是想知道是否存在不使用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 个答案:

答案 0 :(得分:8)

首先,您的print函数应该使用const char*参数而不仅仅是char*,因为它不会修改它。这消除了对任何一次演员的需要。

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

答案 1 :(得分:5)

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

  1. 这将有助于捕捉拼写错误(如果您不小心将“const wchar_t *”强制转换为“char *”,那么const_cast会抱怨。)
  2. 搜索更容易。
  3. 更容易看到。

答案 2 :(得分:4)

如果使用正确,C风格的演员(char *)等同于。如果你搞砸了const_cast,编译器会警告你,如果你弄乱了C风格的演员,你就会得到一个bug。

答案 3 :(得分:3)

const_cast更合适,因为它只会抛弃constness,否则会警告你其他可能的错误(比如将一个指针类型转换为另一个等),而(char *)只会默默地解释你的任何内容将其作为char *。因此,如果可以的话 - 更好地使用const_cast来提高类型安全性。

答案 4 :(得分:1)

独立于C cast在这种特殊情况下的效果,C cast和C ++强制转换是不一样的:C ++区分重新解释,静态,动态和const转换。

这些演员的语义是不同的,并不总是同样可能。

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