C++ 如果我不';t进行施工浇筑<;字符*>;简单地使用(char*)类型转换?

C++ 如果我不';t进行施工浇筑<;字符*>;简单地使用(char*)类型转换?,c++,c++11,C++,C++11,只是想知道在传递char*时不使用const_cast并简单地将其类型转换为(char*)是否有缺点,或者两者基本上是一个或相同的 #include <iostream> #include<conio.h> using namespace std; void print(char * str) { cout << str << endl; } int main () { const char

只是想知道在传递char*时不使用const_cast并简单地将其类型转换为(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;
  }
#包括
#包括
使用名称空间std;
无效打印(字符*str)
{

cout
const\u cast
更合适,因为它只会丢弃constness,否则会警告您其他可能的错误(如将一种指针类型转换为另一种指针类型等),以及
(char*)
只会默默地将您提供的任何内容解释为
char*
。因此,如果您可以更好地使用
const\u cast
,以提高类型安全性。

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

  • 它将有助于捕捉打字错误(如果您意外地将“const wchar\u t*”转换为“char*”,那么const\u cast将抱怨。)
  • 它更容易搜索
  • 这更容易看

  • C样式转换
    (char*)
    如果使用得当,则是等效的。如果你弄乱了
    常量转换
    ,编译器会警告你,如果你弄乱了C样式转换,你只会得到一个bug。

    首先,你的
    print
    函数应该采用
    常量char*
    参数,而不仅仅是
    char*
    ,因为它不会修改它。这消除了需要两种类型


    关于您的问题,C++风格转换(即代码> COSTOSTCAST ,<代码>动态Case等)优先于C样式转换,因为它们表示转换的意图,并且易于搜索。如果我意外地使用类型为

    int
    的a变量而不是
    const char*
    ,则使用
    const_cast
    将导致编译时错误。但是,如果使用C样式转换,它将成功编译,但会生成在运行时内存问题难以诊断。

    < P>独立地,在这种情况下,C Cask和C++的转换效果不一样:C++区分了重新解释、静态、动态和const。 这些类型转换的语义是不同的,并不总是同样可能的


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

    我想说,
    const_cast
    更准确地描述了该演员的表演。例如,你不能错误地相信你是从int开始施法的。@Zyx2000:那么说:)@VladLazarenko我不小心过早地按了回车键。在你的情况下,你最好er使
    print
    const正确,因为如果您尝试使用像现在这样定义的
    c
    使smth非const,您将得到troubles@Bo佩尔松:如果我想突出文字,我该如何使用灰色?我没有在里面做任何事情,这样我就可以只放置我想知道的东西,而不是让事情变得冗长和让人不舒服要查看的其他用户;)。感谢您提供的answr