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>=(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;
}
无论是有点 C 语言基础的人,甚至是学完 C++ 的初学者,都很容易认为这里的输出结果是:n 为 , 为 。但是结果并非所愿,输出结果: 为 , 为 。


