C++ 如果我不';t进行施工浇筑<;字符*>;简单地使用(char*)类型转换?
只是想知道在传递char*时不使用const_cast并简单地将其类型转换为(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
#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)
{
coutconst\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