只是想知道是否存在不使用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) );
或两者基本相同是否有一些缺点?
答案 0 :(得分:8)
首先,您的print
函数应该使用const char*
参数而不仅仅是char*
,因为它不会修改它。这消除了对任何一次演员的需要。
至于你的问题,C ++样式转换(即const_cast
,dynamic_cast
等)优先于C风格的转换,因为它们表达了强制转换的意图,并且它们很容易搜索。如果我不小心使用int
类型的变量而不是const char*
,则使用const_cast
将导致编译时错误。但是,如果我使用C风格的转换,它将成功编译,但在运行时会产生一些难以诊断的内存问题。
答案 1 :(得分:5)
在这种情况下,它们是相同的(从“const char *”转换为“char *”)。 const_cast的优点是:
答案 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可以是静态的,也可以是重新解释的(无法静态)。它必须在需要这种矛盾心理的地方使用(我无法想象如何以及何时),在需要明确定义和预期的行为时必须避免使用。