键入(变量)vs(Type)变量

时间:2012-01-16 14:10:29

标签: c++ casting type-conversion implicit-conversion

  

可能重复:
  What is the difference between (type)value and type(value)?

我主要是一名C#开发人员,因此使用(type)variable等语法进行大量显式转换,并以(int)100.0004d为例。因此,在用C ++编写代码时,我经常使用相同的语法。但是,我已经在其他情况下看到(甚至使用过)代码,其中使用type(variable)语法以int(100.0004)作为示例实现相同的强制转换。

我很好奇两种方法之间的区别是什么,以及使用一种方法是否有任何影响。

示例:

double someDouble = 100.00456;

// Cast the double using the (type)variable syntax
int firstCastValue = (int)someDouble;

// Cast the double using the type(variable) syntax
int secondCastValue = int(someDouble);

3 个答案:

答案 0 :(得分:8)

两者完全相同,任何类型都是如此。

就个人而言,我会避免使用第一种形式(T)x,而采用明确的静态演员:

y = static_cast<T>(x);

这表示您希望 x转换为T类型。

第二种形式更像是构造函数调用的召唤,有时候更可取:

v = std::vector<int>(10);  // not: v = static_cast<std::vector<int>>(10)

重复一遍,两种形式完全相同,这是你喜欢的品味问题。我会使用静态强制转换“转换”和构造函数语法“构建”,如果这有意义的话。

答案 1 :(得分:2)

无。他们完全一样。但这是C ++,你不应该在类型之间使用C风格的强制转换。 static_cast<int>(someDouble)是您正在寻找的。

答案 2 :(得分:1)

他们会做同样的操作。然而,

  • (int)someDouble是C风格的演员,在C ++中气馁。不要使用它。如初。
  • int(someDouble)语法不是这样的强制转换,它是创建临时的显式请求。它允许创建具有多个参数的临时使用构造函数,并使用显式构造函数创建临时。另一方面,它不允许转换为未由单个标识符命名的类型(因此没有指针,没有unsigned long等)。通常在你的意图是暂时使用某些复杂类型时使用,即一个具有非平凡构造函数的类型。
  • static_cast<int>(someDouble)是你大部分时间都应该使用的。它将在任何可转换类型之间以及相关类型的指针之间进行转换。在大多数情况下,你应该限制自己。

还有其他类型的*_cast,即:

  • dynamic_cast<Something *>(pAnything)将在运行时检查指针实际指向指定的类型,如果不指示则返回NULL。也可以使用像dynamic_cast<Something &>(anything)这样的引用,在这种情况下,如果它的类型不正确,它会抛出std::bad_cast异常。这就像C#anything as Something
  • const_cast<Something *>(constSomething)只能删除const限定符;另一个*_cast会拒绝。如果您需要,则存在设计问题。
  • reinterpret_cast<Something *>(pUnrelated)会抛出不相关的指针。因为在C ++中,指针转换不一定是一个简单的操作(为多重继承的对象添加/减去偏移量),它通常是一个坏主意,只有在你做一些聪明的事情时才应该使用它。事实上,我不确定是否会使用reinterpret_cast不违反“严格别名规则”,因此与平台有关。当指针不相关时,C风格的转换衰变重新解释强制转换的原因是它永远不应该被使用的原因。