1.传统的类型转换
在 C 语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。
#include <cstdio>
void test() {
int i = 1; // 隐式类型转换
double d = i;
printf("%d, %.2f\n", i, d);
int* p = &i; // 显示的强制类型转换
int address = (int)p;
printf("%x, %d\n", p, address);
}
转换分为显式和隐式:
- 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
- 显式类型转化:需要用户自己处理
然而这两种转换的前提是逻辑相近:
- 基本类型间的转换(如
int↔double) - 继承层级中的转换(如子类→父类、父类→子类)
- 用户定义的转换(如
operator T()或带参数的构造函数)
例如以下代码会失败,因为逻辑不相近:
string s;
vector<int> v = (vector<int>)s; // 错误示例
对于强制转换还有一种特殊易错的场景:
#include <iostream>
using namespace std;
int main() {
const int n = 10;
int* p = (int*)&n;
(*p)++;
cout << n << endl;
cout << *p << endl;
return 0;
}


