C++中的类型转换

pie*_*lli 17 c++ casting

我正在使用这本书学习C++两个月:编程原理和使用C++的练习,现在我想澄清一些关于我的演员的疑问.当我执行隐式转换时,例如:

char c = 'a'; 
int b = c; 
Run Code Online (Sandbox Code Playgroud)

这里c的值隐式转换为int类型,而不使用任何显式运算符.这被认为是铸造?或者当我必须执行如下的显式转换时,它被认为是铸造:

int a = 10; 
int b = 5.5; 
double sum = double (a) / b; 
Run Code Online (Sandbox Code Playgroud)

我知道这听起来可能是一个愚蠢的问题,但我只是想确定转换.

Col*_*mbo 18

正如其他答案中所提到的,演员表是明确写的.标准将它们称为显式类型转换; [expr.cast]/2:

一个明确的类型转换可以使用功能性的表示法(5.2.3),类型转换运算符(表示dynamic_cast,static_cast, reinterpret_cast,const_cast),或转换符号.

我们称之为强制类型的表达式有三种,在上面引用中提到:

  • (T)expr.在标准中,此表单称为显式类型转换的强制转换表示法,通常也称为C样式强制转换(因为它是在C中使用并从C继承的语法).(double) a就是一个例子.

  • T(expr).这是功能符号(也称为函数式转换).通常用于创建类类型的临时工具,例如std::string("Hello World").double(a)也是一个功能风格的演员阵容.

  • 最后但并非最不重要的是,所谓的类型转换运算符 static_cast<T>(expr), reinterpret_cast,const_cast以及dynamic_cast.这些是最明确的符号,并且单独受到更多限制.

本Q/A涵盖了所有这些内容的使用.

执行的每个其他转换都不称为强制转换.


Lig*_*ica 16

"强制转换"仅在您执行显式转换时执行.

话虽这么说,你会发现整个互联网和各个团队都滥用了这个术语!

  • 即使术语"强制转换"在C++标准中被定义为显式转换,但调用"隐式强制转换"不正确仍然过于强烈.自然语言不是那么干脆.我会说"不精确"或"口语化".但是,标准中的哪个地方甚至可以这么说? (8认同)
  • "cast notation"是一个限定名词,描述了该部分描述的特定符号.这与定义动词"cast"本身不同. (4认同)
  • 如果它经常被滥用,也许它的定义不正确,而不是它的用法.毕竟,自然语言是由它的实际用法*定义的(尽管语法纳粹会让你相信)*.就个人而言,我已经多次听过"隐性演员"一词,并且从未认为它是不正确的. (3认同)
  • @ BlueRaja-DannyPflughoeft:不.我们谈的是国际标准中定义的术语,而不是街头的一些口语.这是_science_,而不仅仅是在酒吧里使用你的"自然语言".标准的全部要点是明确定义描述语言的方法,在这种情况下恰好包括"强制转换"的含义.每次你听到那个词,都是错的.说"你是对错的"是错误的. (3认同)
  • @BlueRaja-DannyPflughoeft:有关显式转换的整个部分的副标题是“强制转换符号”。这就是它的意思。我永远不会相信“你可以说完全相反的话并导致100%矛盾的短语,但没关系,因为‘自然语言’”的废话。正如我已经说过的,我们制定规范是有原因的。是的,“隐式转换”是错误的。我无法阻止你说出这句话,但这是错误的。它扩展到“隐式显式转换”,这是完全没有意义的。你不妨开始称它为“igglewigglewoggle”,它会是一个同样有用的短语。 (2认同)
  • 我在这个问题上使用了LRiO - 人们将错误的"类型转换"改为"类型转换" - "强制转换"总是*显式*,参见例如转换转换(第5.5节)将表达式的类型转换为显式指定的类型演员(第15.16节).(来自JLS) - 我们有"演员","演员转换","演员表"...... OTOH,我们有"隐性转换","拓宽转换"和"类型促销",http://docs.oracle .com/javase/specs/jls/se7/html/jls-5.html - 我知道这是一个C++问题,但C++规范与JLS并行.任何滥用都不会使call'em"演员"有效. (2认同)
  • §5.1.2\ 18引用了lambda表达式中"this"发生的隐式"强制转换".§12.3.1/ 2也指"当明确使用强制转换时",暗示存在隐式强制转换.(尽管如此,我仍然不相信隐含的转换算作演员,这可能仅仅是疏忽) (2认同)

leg*_*s2k 12

扩展(保留值)转换 - 转换回其原始类型后的结果将产生原始值的转换通常是隐式完成的.这个

char c = 'x'; 
int b = c;
Run Code Online (Sandbox Code Playgroud)

是隐式转换.显式转换称为强制转换.

int a = 1;
double sum = static_cast<double>(a) / b;
Run Code Online (Sandbox Code Playgroud)

这里铸造a成一个double明确地完成为两个a并且bints; 如果没有转换,则不会发生转换,从而导致整数除法,而浮点除法可能是优选的,因为它可能更精确.铸造的操作数中的一个/,以double这将导致另一得到隐式转换为double太,因此分裂(及其结果)现在将是浮点.

如果你一直在做double x = a;,你可以取消显式转换,因为int隐式转换为double(实例).从C++ 11标准,N3337草案

- 如果任一操作数为double,则另一个操作数应转换为double.

请参阅此处以获取已执行的隐式转换的完整列表.

  • C++也隐式地进行各种非保值转换. (3认同)