[英]With or without reinterpret_cast
int main()
{
class_name object;
object.method();
fstream file("writeobject.dat" , ios::out|ios::app);
file.write(reinterpret_cast<char*>(&object), sizeof(object));
return 0;
}
///////////////////////////////////////////////////// /////////////////////////////////////////
int main()
{
class_name object;
object.method();
fstream file("writeobject.dat" , ios::out|ios::app);
file.write((char*)&bk,sizeof(book));
return 0;
}
这两个功能之间有什么区别? reinterpret_cast在这里做什么? 我看不到两个main()函数的输出之间的任何区别。
AC样式转换只不过是从以下预定义顺序继承的C ++转换:
在这种情况下,他们正在做同样的事情。 但是,如果您使用的是C ++,则最好使用C ++的显式强制转换样式,因为它们可以更好地表明其意图,而且最好还是清楚地表明所需的强制转换,而不是由编译器决定是否选择强制转换。您。
在上述情况下 ,C样式强制转换和reinterpret_cast
之间在功能上没有区别。
但是, reinterpret_cast
可能被许多人认为是首选,因为它对编译器和其他阅读代码的人都是明确的。
在可能不希望自动转换的情况下,对编译器明确显示是很有价值的。 考虑:
class Foo
{
public:
operator double() const
{
return mD;
}
Foo () : mD (4.12) {};
private:
double mD;
};
int main()
{
Foo foo;
double d = (double) foo;
double d2 = reinterpret_cast <double> (foo);
}
编码:
double d = (double) foo;
进行编译,并在运行时调用转换运算operator double()
。 但是,由于Foo
无法转换为double
因此reinterpret_cast
无法编译。
为了发扬“明确”的理念,在您希望自动转换可用的情况下,可以使用static_cast
:
double d3 = static_cast <double> (foo);
这将再次调用转换运算符。
除了已经给出的好答案之外,在代码中比(char *)
更容易在代码中搜索reinterpret_cast
,后者可能发生在其他地方,不要介意正则表达式类型搜索需要转义以免将*
解释为通配符。
更重要的是,如果您想找到将某个类型的内容从一种指针类型转换为另一种类型的每个位置,则查找所有reinterpret_cast
非常容易,在其中可以找到(int *)
, (char *)
, (uint8_t *)
和(foo **)
将花费大量的精力来找到合适的正则表达式,以匹配所有这些正则表达式,而不会遗漏某些东西,并且不会添加一些您不想要的额外发现。
一个使用C ++样式的reinterpret_cast,另一个使用C样式的强制转换。 C ++样式更好,因为它对所执行的操作更加明确,并使用冗长的语法突出了潜在的危险操作。
在这种情况下,它们的作用与将目标和源类型的这种组合相同时,reinterpret_cast用于c样式转换。 但是,只需稍作更改就可以改变这一点。
说你有
const class_name对象;
而第一种形式将无法编译,而第二种形式将转换为“ reinterpret_cast,然后是const_cast”。 而且,如果您传递给它的函数实际修改了数据,那么您只会在运行时发现它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.