一、显式类型转换的概念
显式类型转换也称为强制类型转换,是程序员在代码中明确指定将一种数据类型转换为另一种数据类型的方式。与隐含转换不同,显式转换由程序员主动写出转换代码,告诉编译器”我知道类型不同,请按我指定的类型进行转换”。
显式类型转换的作用是将表达式的结果类型转换为另外一种指定的类型。
二、显式类型转换的语法
C++ 中支持两种显式类型转换的写法:
写法一(C语言风格):
(类型名)表达式
写法二(函数调用风格):
类型名(表达式)
两种写法效果完全相同,可根据个人习惯选择。
三、示例说明
示例一:浮点数转换为整数
float f = 12.3f;
int i = (int)f;
cout << i << endl; // 输出 12Code language: JavaScript (javascript)
分析:f 的值为 12.3,通过 (int) 强制转换为 int 类型,小数部分被直接舍弃,i 的值为 12。
示例二:函数调用风格
float f = 12.3f;
int i = int(f);
cout << i << endl; // 输出 12Code language: JavaScript (javascript)
两种写法等价,结果相同。
四、代码示例
以下代码演示了显式类型转换的各种使用场景:
#include <iostream>
using namespace std;
int main()
{
// 示例1:浮点转整数(舍弃小数)
double d = 3.99;
int a = (int)d;
cout << "d = " << d << ", a = (int)d = " << a << endl; // a = 3
// 示例2:整数转浮点
int x = 10;
double dx = (double)x / 3;
cout << "x = " << x << ", dx = " << dx << endl; // dx = 3.33333
// 示例3:避免整数除法截断
int m = 7, n = 2;
double result1 = m / n; // 整数除法,结果为 3,再转 double
double result2 = (double)m / n; // m 先转为 double,结果为 3.5
cout << "m/n (no cast) = " << result1 << endl;
cout << "m/n (with cast) = " << result2 << endl;
// 示例4:char 与 int 互转
char ch = 'A';
int ascii = (int)ch;
cout << "ch = " << ch << ", ascii = " << ascii << endl; // ascii = 65
int code = 66;
char ch2 = (char)code;
cout << "code = " << code << ", ch2 = " << ch2 << endl; // ch2 = 'B'
// 示例5:有符号与无符号互转
int neg = -10;
unsigned int u = (unsigned int)neg;
cout << "neg = " << neg << ", u = " << u << endl; // u 为很大的正数
// 示例6:函数调用风格
float f = 5.8f;
int b = int(f);
cout << "b = int(f) = " << b << endl; // b = 5
return 0;
}Code language: PHP (php)
五、注意事项
- 显式类型转换是”强迫”编译器进行转换,不会进行任何运行时检查,转换结果可能不符合预期。
- 浮点数强制转换为整数时,直接舍弃小数部分,不是四舍五入。如需四舍五入应使用 round 函数。
- 将大范围类型转换为小范围类型(如 double 转 int、long 转 short)可能导致数据截断或溢出。
- 有符号数与无符号数之间的强制转换要特别小心,负数转换为无符号数会得到很大的正值。
- 指针类型的强制转换风险更高,可能导致程序崩溃,后续章节会专门讲解。
六、C++ 的四种命名强制类型转换
除了上述 C 风格和函数调用风格的强制转换外,C++ 还提供了四种命名的强制类型转换运算符,更加安全且语义明确:
static_cast:用于相关类型之间的转换,如基本类型转换、基类与派生类指针转换等。
reinterpret_cast:用于不相关类型之间的低层重新解释,如指针与整数互转。
const_cast:用于移除 const 属性。
dynamic_cast:用于多态类型的安全向下转型。
这四种转换方式将在后续章节中详细介绍。
七、小结
- 显式类型转换由程序员主动指定,形式为 (类型名)表达式 或 类型名(表达式)。
- 常见用途:避免整数除法截断、浮点转整数、不同类型混合运算时明确指定转换方向。
- 浮点转整数直接舍弃小数部分,不四舍五入。
- 显式转换可能导致精度损失或数据溢出,使用时应确保转换合理。
- C++ 推荐使用四种命名的强制类型转换运算符替代 C 风格强制转换,以提高代码安全性和可读性。
Previous: 混合运算时数据类型转换
Next: 语句