一、显式类型转换语句:
要把表达式的值显式转换为给定的类型,应编写如下格式的转换语句:
static_cast<type_to_convert_to> (表达式)
关键字 static_cast 表示 这个强制转换要进行静态检查,也就是说,在程序编译时进行检查。
强制转换的结果是把从表达计算的值转换为尖括号中指定的类型。
表达式可以是任何内容,包括从单个变量到包含许多嵌套括号的复杂表达式等所有内容。
通过添加显式强制转换,可以告诉编译器缩窄转换是故意执行的操作。如果不是缩窄转换,很少添加显式强制转换。
二、示例说明:
double value1 {10.9};
double value2 {15.9};
int whole_number {static_cast<int>(value1) + static_cast<int>(value2)};
因为变量 whole_number 的初始值是 value1 和 value2 的整数部分之和,所以它们必须分别显式强制转换为 int 类型。变量 whole_number 的初始值应为 25。
注意:与整数除法相同,将浮点数强制转换为整数会进行截断,即丢弃浮点数的整个小数部分。
强制转换不会影响存储在 value1 和 value2 中的值, 它们仍然是 10.9 和 15.9。由强制转换得到的值 10 和 15 只是临时存储,在计算中使用后就删除。这两个强制转换会在计算过程中丢失信息,但编译器总是假定在显式指定强制转换时,用户知道会发生什么。
如果编写如下语句, whole_number 的值就会不同:
int whole_number {static_cast<int>(value1 + value2)};
value1 和 value2 相加的结果是 26.8,在转换为 int 类型时会得到 26。在初始化列表中,如果不使用显式强制转换,编译器要么拒绝隐式缩窄转换,要么对隐式缩窄转换发出警告。
三、补充:
cmath 头文件中的 std::round()、lround() 和 llround() 函数允许将浮点数四舍五入到最接近的整数。
在许多情况下,使用这些函数比使用(隐式或显式)强制转换更好,因为强制转换会进行截断。