(int)ch vs. int(ch):它们是同一个东西的不同语法吗?

时间:2008-11-04 18:52:50

标签: c++ casting

在C ++中,is(int)ch等价于int(ch)。

如果没有,有什么区别?

8 个答案:

答案 0 :(得分:19)

它们是同一个东西,也与(int)(ch)相同。在C ++中,通常首选使用命名演员来阐明您的意图:

  • 使用static_cast在不同大小或签名的原始类型之间进行投射,例如static_cast<char>(anInteger)
  • 使用dynamic_cast将基类向下转换为派生类(仅限多态类型),例如: dynamic_cast<Derived *>(aBasePtr)
  • 使用reinterpret_cast在不同类型的指针之间或指针与整数之间进行转换,例如reinterpret_cast<uintptr_t>(somePtr)
  • 使用const_cast从变量中删除constvolatile限定符(非常危险),例如const_cast<char *>(aConstantPointer)

答案 1 :(得分:10)

int(x)被标准称为函数样式,并且在各个方面都与C样式相同(对于POD)[5.2.3]:

  

如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在意义上定义)。

答案 2 :(得分:3)

他们是一样的。

答案 3 :(得分:3)

Konrad Rudolph是对的。但请考虑一下

  • (int)x&lt; - 是C和C ++中的有效语法
  • (int *)x&lt; - 是C和C ++中的有效语法
  • int(x)&lt; - 在C ++中有效,但在C
  • 中出现语法错误
  • int *(x)&lt; - 在C和C ++中都给出语法错误

答案 4 :(得分:2)

尽管两种语法对于int具有相同的含义,但第二种构造函数样式的语法更为通用,因为它可以与模板中的其他类型一起使用。也就是说,“T(x)”可以编译成基本类型之间的转换(例如,如果T = int)或构造函数调用(如果T是类类型)。根据我自己的经验,这是一个有用的例子,当我从使用本机类型进行计算的中间结果切换到任意精度的整数时,它们被实现为一个类。

答案 5 :(得分:1)

第一种是C风格,第二种是C ++风格。

在C ++中,使用C ++样式。

答案 6 :(得分:1)

值得注意的是,在C ++中不推荐使用这两种类型的转换,而是赞成Adam Rosenfield的答案中列出的更长,更具体的转换方法。

答案 7 :(得分:-1)

如果你想变得非常讨厌,那么如果你写的东西如下:

#define int(x) 1

然后(int)x具有您期望的含义,而对于任何x值,int(x)将为1。但是,如果有人这样做过,你应该伤害他们。我也完全相信,在#defining关键字中禁止使用标准,但我现在无法找到它。

除此之外,非常愚蠢,特殊情况,如前所述[5.3.2]表示它们与POD相同