在 C++ 中, (int) ch 等价于 int(ch)。
如果不是,有什么区别?
它们是一样的东西,也一样(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
或限定符(非常危险),例如.volatile
const_cast<char *>(aConstantPointer)
int(x)
被标准称为函数样式转换,并且在各个方面都与 C 样式转换相同(对于 POD)[5.2.3]:
如果表达式列表是单个表达式,则类型转换表达式等效于(在定义上,并且如果在含义上定义)对应的强制转换表达式(5.4)。
他们是一样的。
康拉德鲁道夫是对的。但考虑到
尽管这两种语法对于 int 具有相同的含义,但第二种构造函数风格的语法更通用,因为它可以与模板中的其他类型一起使用。也就是说,“T(x)”可以编译为基本类型之间的转换(例如,如果 T = int)或构造函数调用(如果 T 是类类型)。根据我自己的经验,这很有用的一个例子是,当我从使用本机类型作为计算的中间结果切换到任意精度整数时,它被实现为一个类。
第一个是C风格,第二个是C++风格。
在 C++ 中,使用 C++ 样式。
值得注意的是,这两种类型的转换在 C++ 中都已弃用,而是支持 Adam Rosenfield 的答案中列出的更长、更具体的转换方法。
如果你想变得超级讨厌,那么如果你写这样的东西:
#define int(x) 1
那么 (int)x 具有您期望的含义,而对于 x 的任何值,int(x) 将为 1。但是,如果有人这样做,您可能应该伤害他们。我也可以完全相信,在标准中的某个地方,您被禁止使用#defining 关键字,尽管我现在找不到它。
除此之外,非常愚蠢的特殊情况,然后如前所述,[5.3.2] 说它们对于 POD 是相同的