C ++中用于在数字类型之间进行转换的最佳实践

这个问题在这里已经有了答案:

  • 什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast? 6个答案

  • 只需使用static_cast 。 C剧本的问题是操作的模糊性(即显式类型转换的点(1))。

    C ++强制避免这种情况。 此外,C ++强制转换在搜索时更为明显。

    使用Stroustrup的话(static_cast有什么好处?):

    如果在开发或维护过程中涉及的其中一种类型发生变化,那么即使是无辜的演员阵容也会成为一个严重的问题。 例如,这是什么意思?:

      x = (T)y;
    

    我们不知道。 它取决于类型T和x和y的类型。 T可以是一个类的名字,一个typedef ,或者一个模板参数。 也许xy是标量变量, (T)表示值转换。 也许x是从y的类中派生出来的类,而(T)是下垂的。 也许xy是不相关的指针类型。 因为C风格演员(T)可以用来表达许多逻辑上不同的操作,所以编译器只有抓住误用的机会。 出于同样的原因,程序员可能不知道演员的确切内容。 新手程序员有时认为这是一个优点,当新手猜测错误时,这是​​一个微妙的错误来源。

    引入“新风格”是为了让程序员有机会更清楚地陈述他们的意图,并让编译器捕捉更多的错误。

    [切]

    引入新风格演员的次要原因是C风格的演员在节目中很难找到。 例如,您无法使用普通编辑器或文字处理器方便地搜索剧集。

    [切]

    在现代C ++中大部分情况下都是可以避免的

    另外考虑boost::numeric::converter / boost::numeric_cast是更安全的替代方法(Boost.NumericConversion库的一部分)。

    例如

    #include <iostream>
    #include <boost/numeric/conversion/cast.hpp>
    
    int main()
    {
      using boost::numeric_cast;
    
      using boost::numeric::bad_numeric_cast;
      using boost::numeric::positive_overflow;
      using boost::numeric::negative_overflow;
    
      try
      {
        int i = 42;
        short s = numeric_cast<short>(i); // This conversion succeeds (is in range)
      }
      catch(negative_overflow &e)  { std::cout << e.what(); }
      catch(positive_overflow &e)  { std::cout << e.what(); }
    
      return 0;
    }
    

    通常,对于隐式转换和显式转换(通过static_cast ),缺少范围保存会使数值类型之间的转换容易出错。

    numeric_cast在转换数字类型时检测范围的丢失,如果范围不能保留,则引发异常。


    通常,这些铸造操作员分为两大类: 特定铸造操作员传统铸造操作员 。 cplusplus.com这样解释它:

    ...为了控制类之间的这些类型转换,我们有四个特定的转换运算符:dynamic_cast,reinterpret_cast,static_cast和const_cast。 它们的格式是遵循尖括号(<>)和紧随其后的新类型,表达式在括号之间进行转换。

    dynamic_cast <new_type> (expression)

    reinterpret_cast <new_type> (expression)

    static_cast <new_type> (expression)

    const_cast <new_type> (expression)

    这些表达式的传统类型转换等同于:

    (new_type) expression

    new_type (expression)

    但每一个都有其特殊的特征。

    在处理任务时,我们(几乎)都使用特定的投射 。 在考虑这些建议之后,这取决于你。

    查看资源。

    链接地址: http://www.djcxy.com/p/28695.html

    上一篇: Best practice in C++ for casting between number types

    下一篇: C++ Polymorphism: from parent class to child