6

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

如果不是,有什么区别?

4

8 回答 8

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中删除const或限定符(非常危险),例如.volatileconst_cast<char *>(aConstantPointer)
于 2008-11-04T19:07:58.877 回答
10

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

如果表达式列表是单个表达式,则类型转换表达式等效于(在定义上,并且如果在含义上定义)对应的强制转换表达式(5.4)。

于 2008-11-04T19:11:13.253 回答
3

他们是一样的。

于 2008-11-04T19:01:41.697 回答
3

康拉德鲁道夫是对的。但考虑到

  • (int) x <-- 是 C 和 C++ 中的有效语法
  • (int*) x <-- 在 C 和 C++ 中是有效的语法
  • int (x) <-- 在 C++ 中有效,但在 C 中给出语法错误
  • int* (x) <-- 在 C 和 C++ 中都给出语法错误
于 2008-11-04T19:34:48.057 回答
2

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

于 2008-11-04T19:34:31.053 回答
1

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

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

于 2008-11-04T18:57:44.827 回答
1

值得注意的是,这两种类型的转换在 C++ 中都已弃用,而是支持 Adam Rosenfield 的答案中列出的更长、更具体的转换方法。

于 2008-11-05T09:13:14.863 回答
-1

如果你想变得超级讨厌,那么如果你写这样的东西:

#define int(x) 1

那么 (int)x 具有您期望的含义,而对于 x 的任何值,int(x) 将为 1。但是,如果有人这样做,您可能应该伤害他们。我也可以完全相信,在标准中的某个地方,您被禁止使用#defining 关键字,尽管我现在找不到它。

除此之外,非常愚蠢的特殊情况,然后如前所述,[5.3.2] 说它们对于 POD 是相同的

于 2008-11-04T19:16:58.453 回答