1
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() 函数的输出之间有任何区别。

4

5 回答 5

4

AC 样式转换只不过是从以下预定义顺序成功的 C++ 转换:

  • const_cast
  • static_cast
  • static_cast,然后是 const_cast
  • reinterpret_cast
  • 重新解释_cast,然后是 const_cast

在这种情况下,他们正在做同样的事情。但是,如果您使用 C++,最好使用 C++ 风格的显式转换,因为它们更能表明意图,而且明确说明您需要什么转换总是比任由编译器选择一个为你。

于 2013-07-02T15:58:27.257 回答
1

reinterpret_cast C-style cast 和上述 case之间没有功能上的区别。

然而,它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);

这将再次调用转换运算符。

于 2013-07-02T16:12:35.057 回答
1

除了已经给出的好的答案之外,reinterpret_cast在代码中搜索比在其他地方可能发生的 更容易(char *),不要介意正则表达式类型搜索需要一些转义才能不将 解释*为通配符。

更重要的是,如果您想找到将某些指针类型从一种指针类型转换为另一种指针类型的每个地方,那么查找所有reinterpret_cast内容非常容易,在哪里找到 , , 的所有变体,(int *)并且想出正确的正则表达式来匹配所有这些而不会遗漏一些东西,也不会添加一些您不想要的额外发现。(char *)(uint8_t *)(foo **)

于 2013-07-02T16:14:54.190 回答
0

在这种情况下,它们的作用与目标和源类型的组合相同,reinterpret_cast 用于 c 样式转换。但只要稍微改变一下就可以改变这一点。

说你有

常量类名对象;

第一种形式无法编译,而第二种形式切换到“reinterpret_cast,然后是 const_cast”。如果你传递给它的函数实际上修改了数据,你只会在运行时发现。

于 2013-07-02T16:05:45.363 回答
0

一个使用 C++ 风格的 reinterpret_cast,另一个使用 C 风格的强制转换。C++ 风格更好,因为它更明确地说明了它在做什么,并用冗长的语法突出了一个潜在的危险操作。

于 2013-07-02T15:58:09.503 回答