我正在使用这本书学习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
"强制转换"仅在您执行显式转换时执行.
话虽这么说,你会发现整个互联网和各个团队都滥用了这个术语!
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并且b是ints; 如果没有转换,则不会发生转换,从而导致整数除法,而浮点除法可能是优选的,因为它可能更精确.铸造的操作数中的一个/,以double这将导致另一得到隐式转换为double太,因此分裂(及其结果)现在将是浮点.
如果你一直在做double x = a;,你可以取消显式转换,因为int隐式转换为double(实例).从C++ 11标准,N3337草案
- 如果任一操作数为double,则另一个操作数应转换为double.
请参阅此处以获取已执行的隐式转换的完整列表.