运算对象类型的转换


运算对象类型的转换

主要记录一些不太清晰的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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值