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()函数的输出之间有任何区别。
答案 0 :(得分:4)
C样式转换只是从预定义的顺序成功的C ++转换:
在这种情况下,他们正在做同样的事情。但是,如果你使用C ++,最好使用C ++样式的显式转换,因为它们更能说明意图,而且总是更好地明确你需要什么样的转换,而不是由编译器选择一个您。
答案 1 :(得分:1)
在上述案例中,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()
。但是reinterpret_cast
无法编译,因为Foo
无法转换为double
。
为了实现“明确”的理念,如果您希望自动转换可用,您可以使用static_cast
:
double d3 = static_cast <double> (foo);
这将再次调用转换运算符。
答案 2 :(得分:1)
除了已经给出的好答案之外,reinterpret_cast
在代码中搜索比(char *)
更容易,这可能发生在其他地方,更不用说正则表达式搜索需要一些转义不将*
解释为通配符。
更重要的是,如果你想找到你从一种指针类型转换到另一种指针类型的地方,找到所有reinterpret_cast
非常容易,找到(int *)
的所有变体,{{1} },(char *)
和(uint8_t *)
会有相当多的努力想出正确的正则表达式来匹配所有那些没有遗漏的东西,而不是添加一些你不想要的额外发现。
答案 3 :(得分:0)
一个使用C ++风格的reinterpret_cast,另一个使用C风格的演员。 C ++风格更好,因为它更清楚它正在做什么,并用冗长的语法突出显示一个潜在的危险操作。
答案 4 :(得分:0)
在这种情况下,它们与目标和源类型的组合相同,reinterpret_cast用于c样式转换。但只是稍微改变就可以改变这一点。
说你有
const class_name object;
并且第一个表单将不会编译,而第二个表单将切换为“reinterpret_cast,然后是const_cast”。如果您传递的函数实际修改了数据,那么您只能在运行时发现它。