C++ 类型转换详解:显式运算符与底层机制
关于类型转换,通常分为隐式转换或者强制转换。C++ 提供了一些能够显式表示转换的运算符,相比传统方式能更好地规避风险和错误。
1. 传统的类型转换
在 C 语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。
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()或带参数的构造函数)
例如以下代码就会失败,因为逻辑不相近:
std::string s;
// std::vector<int> v = (std::vector<int>)s; // 这种转换会失败
对于强制转换还有一种特殊易错的场景,涉及存储规则的问题:
int main() {
const int n = 10;
int* p = (int*)&n;
(*p)++;
std::cout << n << std::endl;
std::cout << *p << std::endl;
return 0;
}
无论是有点 C 语言基础的人,甚至是学完 C++ 的初学者,都很容易认为这里的输出结果是 n 为 11,*p 为 。但是结果并非所愿,实际输出 为 , 为 。


