撒拉嘿哟木头 2008-09-19 16:33 采纳率: 100%
浏览 131
已采纳

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

I've heard that the static_cast function should be preferred to C-style or simple function-style casting. Is this true? Why?

转载于:https://stackoverflow.com/questions/103512/why-use-static-castintx-instead-of-intx

  • 写回答

9条回答 默认 最新

  • 7*4 2008-09-19 17:23
    关注

    The main reason is that classic C casts make no distinction between what we call static_cast<>(), reinterpret_cast<>(), const_cast<>(), and dynamic_cast<>(). These four things are completely different.

    A static_cast<>() is usually safe. There is a valid conversion in the language, or an appropriate constructor that makes it possible. The only time it's a bit risky is when you cast down to an inherited class; you must make sure that the object is a actually the descendant that you claim it is, by means external to the language (like a flag in the object). A dynamic_cast<>() is safe as long as the result is checked (pointer) or a possible exception is taken into account (reference).

    A reinterpret_cast<>() (or a const_cast<>()) on the other hand is always dangerous. You tell the compiler: "trust me: I know this doesn't look like a foo (this looks as if it isn't mutable), but it is".

    The first problem is that it's almost impossible to tell which one will occur in a C-style cast without looking at large and disperse pieces of code and knowing all the rules.

    Let's assume these:

    class CMyClass : public CMyBase {...};
    class CMyOtherStuff {...} ;
    
    CMyBase  *pSomething; // filled somewhere
    

    Now, these two are compiled the same way:

    CMyClass *pMyObject;
    pMyObject = static_cast<CMyClass*>(pSomething); // Safe; as long as we checked
    
    pMyObject = (CMyClass*)(pSomething); // Same as static_cast<>
                                         // Safe; as long as we checked
                                         // but harder to read
    

    However, let's see this almost identical code:

    CMyOtherStuff *pOther;
    pOther = static_cast<CMyOtherStuff*>(pSomething); // Compiler error: Can't convert
    
    pOther = (CMyOtherStuff*)(pSomething);            // No compiler error.
                                                      // Same as reinterpret_cast<>
                                                      // and it's wrong!!!
    

    As you can see, there is no easy way to distinguish between the two situations without knowing a lot about all the classes involved.

    The second problem is that the C-style casts are too hard to locate. In complex expressions it can be very hard to see C-style casts. It is virtually impossible to write an automated tool that needs to locate C-style casts (for example a search tool) without a full blown C++ compiler front-end. On the other hand, it's easy to search for "static_cast<" or "reinterpret_cast<".

    pOther = reinterpret_cast<CMyOtherStuff*>(pSomething);
          // No compiler error.
          // but the presence of a reinterpret_cast<> is 
          // like a Siren with Red Flashing Lights in your code.
          // The mere typing of it should cause you to feel VERY uncomfortable.
    

    That means that, not only are C-style casts more dangerous, but it's a lot harder to find them all to make sure that they are correct.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制