关于类型转换,通常是隐式转换或者强制转换,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()或带参数的构造函数)
string s; vector<int>=(vector<int>) s; // 这种转换就会失败,因为逻辑不相近
对于强制转换还有一种特殊易错的场景。
int main() {
const int n = 10;
int* p = (int*)&n;
(*p)++;
cout << n << endl;
cout << *p << endl;
return 0;
}
无论是有点 C 语言基础的人,甚至是学完 C++ 的初学者,都很容易认为这里的输出结果是:n 为 11,*p 为 11。但是结果并非所愿,输出结果:n 为 10,*p 为 11。
实际上这里涉及到存储规则的问题,因为 是 变量,那么会被识别为一个常变量,可能会是一个经常被使用的值,就把 存入寄存器,把频繁使用的变量的值暂存到寄存器中,这样在后续对该变量的读取操作中,就不需要每次都去内存中读取,直接从寄存器中获取即可,因为寄存器的读写速度比内存快很多。


