(int)ch与int(ch):同一事物的语法是否不同? 在C++中,IS(int)等于int(CH)。
(int)ch与int(ch):同一事物的语法是否不同? 在C++中,IS(int)等于int(CH)。,c++,casting,C++,Casting,如果不是,有什么区别? < P>第一种是C风格,第二种是C++风格。 在C++中,使用C++风格。它们是相同的。< P>它们是相同的,也与(int)(CH)< /C>相同。在C++中,通常使用命名的CAST来阐明您的意图: 使用static\u cast在不同大小或符号的基本类型之间进行转换,例如static\u cast(一个整数) 使用dynamic\u cast将基类向下转换为派生类(仅限多态类型),例如dynamic\u cast(abaseptor) 使用reinterpret\u
如果不是,有什么区别?
< P>第一种是C风格,第二种是C++风格。在C++中,使用C++风格。
它们是相同的。
< P>它们是相同的,也与<代码>(int)(CH)< /C>相同。在C++中,通常使用命名的CAST来阐明您的意图:- 使用
在不同大小或符号的基本类型之间进行转换,例如static\u cast
static\u cast(一个整数)
- 使用
将基类向下转换为派生类(仅限多态类型),例如dynamic\u cast
dynamic\u cast(abaseptor)
- 使用
在不同类型的指针之间或指针与整数之间进行转换,例如reinterpret\u cast
reinterpret\u cast(somePtr)
- 使用
删除变量(非常危险的const\u cast
限定符)中的
或const
限定符,例如volatile
const\u cast(acontstantpointer)
int(x)
被标准称为功能样式转换,在各个方面与C样式转换相同(对于POD)[5.2.3]:
如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(定义和定义)
如果你想变得非常讨厌,那么如果你写了这样的东西:
#define int(x) 1
然后(int)x具有您期望的含义,而int(x)对于x的任何值都是1。然而,如果有人这样做,你可能会伤害他们。我也很相信,在标准的某个地方,你被禁止定义关键词,尽管我现在找不到
除此之外,非常愚蠢的特殊情况,如前所述,[5.3.2]表示它们对于POD是相同的尽管这两种语法对于int的含义相同,但第二种构造函数样式的语法更通用,因为它可以与模板中的其他类型一起使用。也就是说,“T(x)”可以编译成原语类型之间的转换(例如,如果T=int)或构造函数调用(如果T是类类型)。根据我自己的经验,这是一个有用的例子,当我从使用本机类型进行中间计算结果转换为任意精度整数时,它们被实现为一个类。Konrad Rudolph是正确的。但是考虑一下
- (int)x值得注意的是,两种风格的铸造都在C++中被贬低,有利于Adam Rosenfield的答案中列出的更长、更具体的铸造方法。< / P>可以说C++风格实际上是静态的(CH)。但是那更冗长:更真实。在分析代码时搜索问题也容易得多。当人们说不要对内置类型使用函数类型转换,但却非常乐意对用户类型使用1-arg构造函数时,我感到困惑,尽管它们完全是一样的。要么遵循推理得出逻辑结论,要么根本不遵循-p@onebyone:不,UDT仍然有一个关键区别:您知道将调用构造函数。对于基本数据类型,您无法确定;您可以触发一个
或丢弃重新解释强制转换
,而无需执行此操作。不太好。也就是说,我通常使用常量
。它们可能是-但根据标准,它们不能保证是相同的。事实上,5.2.3同意我的观点;对于单个表达式,它是“等效的”,但不是“相同的”;对于更复杂的表达式,它可能是“相同的”,也可能不是“相同的”,因此“等效”和“相同的”等效、相同或相同?重新解释也是非常危险的。如果小心的话,您至少可以有效地取消引用常量强制转换指针,但对于重新解释的指针,您唯一可以有效地执行的操作是稍后将其重新转换回原始类型。哦,我想你可以安全地比较一下……同样的行为可以通过使用static\u cast
实现。正如亚当所说,澄清意图对于这些危险的行动非常重要。不需要使用更危险的函数样式转换。这是一个很好的说明。基本类型和指针的函数样式转换完全等同于C中的通用转换,这是不安全的,因为您可以损坏指针或绕过“const”和“volatile”提供的保护。静态\u cast