//类型转换
隐式转换:类型自动转换,无须操作
隐式转换发生的一些情况
1.比int类型小的整型值首先提升为较大的整数类型
2.在条件中,非布尔值转换成布尔值
3.初始化时,赋值时
4.运算对象有多种类型时
5.函数调用或返回时
算术转换:运算符的运算对象将转换成最宽的类型
整型提升:转换后的类型要能容纳原类型所有可能的值。
无符号类型转换:先整型提升,如果结果类型匹配,无须再进行下一步转换;
如果类型不匹配,则小类型转换成大类型
bool flag; char cval;
short sval; unsigned short usval;
int ival; unsigned int uival;
long lval; unsigned long ulval;
float fval; double dval;
auto da = 3.1415L + 'a';//'a'提升成int,然后该int转换成long double;
cout << typeid(da).name() << endl;//为long double
dval + ival;//ival转换成double
dval + fval;//fval转换成double;
ival = dval;//dval转换成(切除小数部分)int
flag = dval;//如果dval非0则flag为true,否则为false
cval + fval;//cvar提升成int,然后转换成float
sval + cval;//都提升成int
ival + ulval;//ival转换成 unsigned long
usval + ival;//根据unsigned short和int所占空间大小提升
uival + lval;//根据unsigned int和long所占空间大小提升
unsigned short us = 1234;
int iv = 25;
auto num = us + iv;
cout << typeid(num).name() << endl;//int
unsigned int ui = 12345;
long lv = 123;
auto num1 = ui + lv;
cout << typeid(num1).name() << endl;//unsigned long
*/
数组转换成指针:数组自动转换成指向首元素的指针,decltype、&、sizeof、typeid不会转换。
int ar[10];
int *p = ar;
int *ap = &ar;//错误
int a = 10;
decltype(ar) b;//b为int[10],没有转换成指针
cout << typeid(ar).name() << endl;//int[10], 没有转换成指针
cout << sizeof(ar) << endl;//计算出所占内存大小
//指针的转换
0或nullprt能转换成任意指针类型
int *p(0);
float *f(nullptr);
cout << typeid(p).name()<<" " << typeid(f).name() << endl;
指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*
int a = 12;
int *ap = &a;
cout << typeid((void*)ap).name() << endl;
const float b = 12;
const float * bp = &b;
cout << typeid((const void *)bp).name() << endl;
转换成布尔类型:如果指针或算术类型的值为0,转换为false,否则为true
//转换成常量:非常量可转常量,常量不能转非常量
int i(10);
const int &j = i;//非常量转换成常量引用
const int *p = &i;//非常量的地址转换成常量地址
int &r = j, *q = p;//错误不允许const转换成非常量
类类型定义的转换
string str = "asdwrwra";//字符串字面值转换成string类型
//显示转换:强制转换
static_cast:任何具有明确定义的类型转换,只要不包含底层const都可以使用
int d = 10;
void *p = &d;
double *dp = static_cast<double*>(p);
const char *pc;
char *sp = static_cast<char*>(pc);//错误static_cast不能转换掉const属性
const_cast:只能改变运算对象的底层const
const char *pc;
char *p = const_cast<char*>(pc);*/
int ipc = const_cast<int*>(pc);//错误const_cast只能改变常量属性