一、隐式类型转换 —— 编译器的 “自动翻译官”
隐式转换是编译器悄悄完成的类型转换,无需手动干预,常见于赋值、运算、传参等场景。
1. 赋值时的 “悄悄变身”
- 例 1:小数转整数,丢失小数部分
c
运行
double pi = 3.1415; int int_pi = pi; // double隐式转int,int_pi = 3 - 例 2:int 转 char,取低字节值
c
运行
int num = 97; // 'a'的ASCII值 char c = num; // int隐式转char,c = 'a'
2. 算术运算时的 “统一标准”不同类型运算时,“小范围类型” 自动转 “大范围类型”,避免数据丢失。
- 例:int 与 float 相加,int 先转 float
cpp
运行
int a = 2; float b = 1.5f; float sum = a + b; // a隐式转float(2.0f),sum = 3.5f
3. 函数传参 / 返回时的 “自动适配”
- 例 1:实参 int 转形参 double
cpp
运行
void print_double(double x) { /* ... */ } print_double(10); // int 10隐式转double 10.0 - 例 2:返回值 double 转 int
cpp
运行
int get_int() { return 5.9; // double 5.9隐式转int 5 }
二、显式类型转换 —— 手动 “指挥” 类型变形
当隐式转换不符合预期时,需手动指定转换方式。C 和 C++ 的显式转换语法不同,C++ 新增了更安全的转换运算符。
1. C 语言的 “简单粗暴” 转换:(目标类型) 表达式
直接用括号强制转换,编译器几乎不检查安全性,可能隐藏风险。
- 例 1:double 强制转 int
c
运行
double score = 95.5; int int_score = (int)score; // 结果95 - 例 2:超出范围的转换
c
运行
int big_num = 300; // char范围通常是-128~127 char c = (char)big_num; // 结果可能是44,存在风险
2. C++ 的 “智能转换工具”:4 种标准转换符
C++ 提供 4 种转换运算符,分工明确,安全性更高,推荐优先使用。
-
static_cast:常规转换小能手用于 “相关类型” 转换,编译时检查合理性,不支持无关类型。
- 例 1:基本类型转换
cpp
运行
float f = 3.14f; int i = static_cast<int>(f); // 结果3 - 例 2:父类指针转子类指针
cpp
运行
class Parent {}; class Child : public Parent {}; Parent* p = new Child; Child* c = static_cast<Child*>(p); // 编译通过
- 例 1:基本类型转换
-
dynamic_cast:多态安全卫士仅用于含虚函数的 “多态类”,运行时检查转换是否安全,失败返回 nullptr。
- 例:安全的子类指针转换
cpp
运行
class Animal { virtual void eat() {} }; // 含虚函数,多态类 class Dog : public Animal { void bark() {} }; class Cat : public Animal { void meow() {} }; Animal* a = new Dog; Dog* d = dynamic_cast<Dog*>(a); // 成功,d指向Dog对象 Cat* c = dynamic_cast<Cat*>(a); // 失败,c = nullptr
- 例:安全的子类指针转换
-
const_cast:去 const 小钥匙仅用于移除指针 / 引用的 const 属性,不能直接修改 const 变量的值。
- 例:修改非 const 变量的 const 引用
cpp
运行
int x = 10; const int& ref_x = x; int& non_const_ref = const_cast<int&>(ref_x); non_const_ref = 20; // x的值变为20,安全
- 例:修改非 const 变量的 const 引用
-
reinterpret_cast:二进制重解释器直接按二进制位重新解释数据,不做类型检查,仅用于底层场景。
- 例:int 指针转 long
cpp
运行
int a = 10; long addr = reinterpret_cast<long>(&a); // 将a的地址转为long值
- 例:int 指针转 long
三、总结:转换方式怎么选?
表格
| 场景 | 推荐转换方式 | 安全性 |
|---|---|---|
| 基本类型 / 相关指针转换 | C++ static_cast | 较高 |
| 多态类指针 / 引用转换 | C++ dynamic_cast | 最高 |
| 移除 const 属性 | C++ const_cast | 谨慎使用 |
| 底层二进制转换 | C++ reinterpret_cast | 最低 |
| 兼容 C 代码 | C 语言 () 转换 | 低 |

251

被折叠的 条评论
为什么被折叠?



