类型转换
1.首先是最简单的类型转换
int a = 3;
double b = 3.14;
int c = a + b;
- 不同类型的变量不能想加,所以在计算c的时候,需要将最后的结果6.14转换成6,在这里就发生了隐式转换
2.隐式转换的时机
- 在混合类型的表达式中,操作数转换成相同的类型
int a;
double b;
a >= b;
- 用作条件的表达式被转化为bool类型
int val;
if(val)
while(val)
- 用一表达式初始化某个变量,或者是赋值给某个变量
int a = 3.14;
int *p = 0;
另外,在函数调用中也可能会发生隐式类型转换,此处着重讨论的是变量。
3.算术转换
- 找到类型中最宽的类型,并将所有的数据都转化成该类型
- 最简单的转换就是整型提升
- 关于有符号的无符号类型之间的转换,参考我的另一篇博客
- https://blog.csdn.net/weixin_42873905/article/details/112545903
4.其他隐式转换
(1)指针转换
在使用数组的时候,大多数情况下都会自动转化为指向第一个元素的指针
int arr[10];
int *p = arr;
- 其中,也有不将数组转化为指针的情况:数组用作取地址操作符、或者用作sizeof操作符的操作数、或者用数组对数组进行初始化,这些都不会将数组转化为指针
- 还有另外两种指针转换,指向任意类型的指针都可以转换为void*类型、整型数值常量0可转化为任意的指针类型。
(2)转化成bool类型
(3)算术类型与bool类型的转换
(4)转换与枚举类型
(5)转换成const对象 - 当使用非const对象初始化const对象的引用时,系统将非const对象转化为const对象
- 还可以将非const对象的地址(或者是非const指针)转换为指向相关const类型的指针
int i;
const int ci = 0;
const int &j = i;
const int *p = &ci;
(6)由标准库类型定义的转换
在我们使用过的标准库类型中,有一个重要的类型转换:
std::string s;
while(std::cin >> s)
- 这里隐式的使用了IO标准库定义的类型转换,将读取内容的类型转换成bool类型。
上述都是隐式转换的一些例子,显式转换包括static_cast、dynamic_cast、const_cast、reinterpret_cast,这四种转换的讲解在其他的博客中
地址:https://blog.csdn.net/weixin_42873905/article/details/106894914