文章目录
运算对象类型的转换
主要记录一些不太清晰的C++对象转换,学习于c++ primer(第五版)。
一、隐式类型转换
隐式类型转换是指在运算过程中,自动进行类型的转换。
1.整型提升
整型提升负责把小整数类型转换成较大的整数类型。
如较大的char类型(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long等等中最小适合的类型,也就是要求转换后的类型能容纳原类型所有的可能的值。(注:有无符号以及移位操作符也会进行转换
)
bool flag; char cval;
short sval; unsigned short usval;
int ival; unsigned int uival;
long lval; unsigned long ulval;
float fval; double dval;
3.14159L + 'a'; // 'a'提升为int,然后int类型转换为大的long double类型
dval + ival; // ival转换为double
dval + fval; // fval转换为double
ival = dval; // 切除小数部分,dval转为int
flag = dval; // 如果dval是0转为false,否则转为true
cval + fval; // cval提升为int,然后int类型转为float类型
sval + cval; // sval以及cval都转为int类型
cval + lval; // cval转为long类型
ival + ulval; // ival转为unsigned long类型
usval + ival; // 根据unsigned short和int所占空间的大小进行提升
uival + lval; // 根据unsigned int和long所占空间的大小进行提升
unsigned char bits = 0233;
bits << 8; // unsigned char转为int类型
int a = 1; unsigned int b = 0, c = 2;
long long d = 1;
cout << sizeof(a) << endl;
cout << typeid(a + b).name() << endl; // a转为unsigned int类型
cout << typeid(a + c).name() << endl; // a转为unsigned int类型
cout << typeid(b + d).name() << endl; // b转为long long int类型
2.数组隐式转换成指针
int q1[10];
int* ip = q1; // q1转换程指向数组首元素的指针
二、显示转换
1.static_cast
只要不包含底层const,都可以使用static_cast。
// 显示声明进行类型转换,编辑器将不再进行警告
int j = 1;
double a1 = static_cast<double>(j);
// 可以对编译器无法自动执行的类型转换进行转换,比如找回void*指针中的值
double* k1;
void* k2 = k1;
double* a2 = static_cast<double*>(k2);
// 可以去除顶层const
const double m1 = 9;
int a3 = static_cast<int>(m1);
a3++;
// 不能去除带有底层const的对象
const char* k3;
char* a4 = static_cast<char*>(k3);
// char*可以转换成string类型
char* k4;
string a5 = static_cast<string>(k4);
2.const_cast
该方法就是针对以上static_cast不能完成的部分,可以去掉某个对象的底层const性质。
// const_cast去除底层const
char* b1 = const_cast<char*>(k3);
3.reinterpret_cast
通常为运算对象的位模式
提供较低层次上的重新理解。
int* ip;
char* pc = reinterpret_cast<char*>(ip);
4.dynamic_cast
支持运行时类型识别。
5.旧时的强制类型转换
旧时转换方法分别具有于const_cast、static_cast或reinterpre_cast相似的行为,
但是从表现形式上不那么清晰明了,
容易被看漏。
// 实现类型转换,旧时强制类型转换有两张方法
int m = (int)2.5;
int n = int(2.5);
// 完成const_cast的功能去除底层const
const char* m1;
char* n1 = (char*)m1;
// 完成reinterpret_cast的功能按位操作进行转换
int* ip;
char* pc = (char*)ip;