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

时间:2016-05-28 08:47:12

标签: c++ casting numeric-conversion

在不同数字类型之间进行投射的最佳做法是什么?类型floatdoubleint是我在C ++中使用最多的类型。

ffloatndoubleint的选项示例:

float f = static_cast<float>(n);
float f = float(n);
float f = (float)n;

我经常写static_cast<T>(...),但想知道如果有一种首选方式,C ++开发社区是否有任何共识。

我很欣赏这可能最终成为一个基于意见的问题而且可能没有&#34;标准&#34;方式,在这种情况下,请让我知道没有标准的方式,所以至少我知道: - )

我知道这个问题与一般的投射有关cropped up,但是,我特别关注数字以及数字类型方法中是否有特定的最佳实践。

2 个答案:

答案 0 :(得分:6)

只需使用static_cast即可。 C强制转换的问题是操作的模糊性(即Explicit type conversion的点(1))。

C ++演员避免这种情况。另外,C ++强制转换在搜索时更加明显。

使用Stroustrup的单词(What good is static_cast?):

  

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

  x = (T)y;
     

我们不知道。它取决于类型T以及x和y的类型。 T可以是类的名称,typedef或模板参数。可能xy是标量变量,(T)代表值转换。也许x属于从y类中派生的类,而(T)是向下倾斜的类。也许xy是不相关的指针类型。因为C风格的转换(T)可以用来表达许多逻辑上不同的操作,所以编译器只有最小的机会来捕获误用。出于同样的原因,程序员可能不知道演员的具体内容。这有时被新手程序员认为是一种优势,并且在新手猜错时是一个微妙错误的来源。

     

&#34;新式演员&#34;介绍是为了让程序员有机会更清楚地陈述他们的意图,并让编译器捕获更多的错误。

     

[CUT]

     

引入新式演员阵容的第二个原因是C风格的演员阵容很难在节目中发现。例如,您无法使用普通编辑器或文字处理器方便地搜索演员表。

     

[CUT]

     在现代C ++中,

强制转换实际上是可以避免的

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

E.g。

#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检测到范围丢失,如果无法保留范围,则抛出异常。

答案 1 :(得分:-1)

一般来说,这些铸造运营商分为两大类: 特定的铸造运营商传统的铸造运营商cplusplus.com解释如下:

  

...为了控制类之间的这些类型的转换,我们有四个特定的转换操作符:dynamic_cast,reinterpret_cast,static_cast和const_cast。它们的格式是遵循括号(&lt;&gt;)和紧跟在括号之间转换的表达式之间的新类型。

     

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)

     

但每一个都有自己的特色。

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

请参阅resource