20

在不同数字类型之间进行转换的最佳做法是什么?Types float, double,int是我在 C++ 中使用最多的类型。

fwhere is a floatand nis a doubleor an选项示例int

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

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

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

我知道这个问题通常与铸造有关,但是,我对数字特别感兴趣,以及在数字类型的方法中是否有特定的最佳实践。

4

2 回答 2

16

只需使用static_cast. C 类型转换的问题在于操作的模糊性(即显式类型转换的第 (1) 点)。

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

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

如果在开发或维护期间,所涉及的类型之一发生了变化,即使是看起来很无辜的演员表也可能成为一个严重的问题。例如,这是什么意思?:

  x = (T)y;

我们不知道。这取决于Tx 和 y 的类型和类型。T可以是类名、atypedef或模板参数。也许xy是标量变量,(T)表示值转换。Maybex是从y's 类派生的类,并且(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转换数字类型时检测范围丢失,如果无法保留范围则抛出异常。

于 2016-05-28T08:57:21.767 回答
-2

通常,这些铸造操作者分为两大类: 特定铸造操作者传统铸造操作者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)

但每一种都有自己的特点。

在处理一项任务时,我们(几乎)都使用特定的 cast。在考虑了建议之后,以某种方式取决于您。

请参阅资源

于 2016-05-28T09:00:30.657 回答