为什么使用静态强制转换 int (x)而不是(int) x?

源码客栈网 毕业设计 1

我听说 static_cast 函数应该优先于 C 风格或简单的函数风格转换。这是真的?为什么?

回复

共2条回复 我来回复
  • 毕设港湾
    这个人很懒,什么都没有留下~
    评论

    问题不仅仅是使用 wither static_cast 或 C 风格转换,因为在使用 C 风格转换时会发生不同的事情。C++ 强制转换运算符旨在使这些操作更加明确。

    从表面上看,static_cast 和 C 风格的转换看起来是一样的,例如,当将一个值转换为另一个值时:

    int i;
    double d = (double)i;                  //C-style cast
    double d2 = static_cast<double>( i );  //C++ cast
    

    这两个都将整数值转换为双精度值。然而,当使用指针时,事情变得更加复杂。一些例子

    class A {};
    class B : public A {};
    
    A* a = new B;
    B* b = (B*)a;                                  //(1) what is this supposed to do?
    
    char* c = (char*)new int( 5 );                 //(2) that weird?
    char* c1 = static_cast<char*>( new int( 5 ) ); //(3) compile time error
    

    在这个例子中 (1) 可能没问题,因为 A 指向的对象实际上是 B 的一个实例。但是如果你在代码中不知道 a 实际指向的那个点怎么办?(2) 可能完全合法(您只想查看整数的一个字节),但也可能是错误,在这种情况下,错误会很好,例如 (3)。C++ 强制转换运算符旨在通过在可能的情况下提供编译时或运行时错误来暴露代码中的这些问题。

    因此,对于严格的“值转换”,您可以使用 static cast。如果您想要指针的运行时多态转换,请使用 dynamic cast。如果你真的想忘记类型,你可以使用 reintrepret cast。并且只是将 const 扔出窗外,有 const cast。

    0条评论
  • 毕设海岸
    这个人很懒,什么都没有留下~
    评论

    除了操作指向类的指针之外,static_cast 还可用于执行类中显式定义的转换,以及执行基本类型之间的标准转换:

    double d = 3.14159265;
    int    i = static_cast<int>(d);
    
    0条评论

发表回复

登录后才能评论