只想知道在传递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_cast
、dynamic_cast
等)比C风格的强制类型转换更受欢迎,因为它们表达了强制类型转换的意图,并且易于搜索。如果我意外地使用了int
而不是const char*
类型的变量,那么使用const_cast
将导致编译时错误。然而,如果我使用C样式转换,它将成功编译,但在运行时会产生一些难以诊断的内存问题。
在这种情况下,它们是相同的(从"const char*"转换为"char*")。const_cast的优点是:
- 它将有助于发现拼写错误(如果您不小心将"const wchar_t*"转换为"char*",那么const_cast就会抱怨。)
- 搜索起来更容易
- 它更容易看到
如果使用得当,C样式转换(char *)
等效于。如果你把const_cast
搞砸了,编译器会警告你,如果你把C风格的转换搞砸了你就会得到一个错误。
const_cast
更合适,因为它只会抛出常量,否则会警告您其他可能的错误(如将一种指针类型转换为另一种等),而(char *)
只会默默地将您给它的任何内容解释为char *
。因此,如果你能更好地使用const_cast
,以获得更好的类型安全性。
与C强制转换在这种特殊情况下的效果无关,C强制转换和C++强制转换并不相同:C++区分重新解释、静态、动态和常量强制转换。
这些强制转换的语义是不同的,并不总是同样可能。
C强制转换可以是静态的,也可以是重新解释强制转换(在不可能是静态的情况下)。它必须用于需要这种矛盾心理的地方(我无法想象如何以及何时),必须避免用于需要明确定义和预期行为的地方。