类型转换

一、运算对象既包含无符号类型也有带符号类型

1. 无符号类型不小于带符号类型,带符号的运算对象将转换成无符号的

如:假设两个运算对象的类型分别为 unsigned int 和 int,那么 int 类型的运算对象将转换成 unsigned int 类型。

	unsigned a = 0;
	int i = -1;
	auto x = a + i;		//x类型被自动转换为unsigned,在这个表达式a+i内,i的值转换为-1+2
32
	cout << a << " " << i << " " << x << endl;  //a为0,i为-1,x为4294967295

表达式 a+i 中,i 的类型会被转换为 unsigned 类型,但是由于 i 是负值,所以 i 的值会变为这个负值加上无符号数的模(即232)。

2. 无符号类型小于带符号类型,此时转换的结果依赖于机器

  1. 如果无符号类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型;
  2. 如果....................................不能....................................,则带符号类型的运算对象转换成无符号类型。

 

二、指针的转换

常量整数值0或字面值nullptr能转换成任意指针类型

指向任意非常量的指针能转换成void *

指向任意对象的指针能转换成const void *

 

三、static_cast

作用于:任何具有明确定义的类型转换,只要不包含底层const。

其他:可以执行编译器无法自动执行的类型转换。

如:double ans = static_cast<double>(j) / i;

 

四、const_cast

作用于:只能改变运算对象的底层const,不能改变表达式的类型

其他:改变表达式的常量属性

 

	const char *pc;					//底层const 
	char *p = const_cast<char *>(pc);	//通过p写值是未定义的行为

 

我们称“将常量对象转换成非常量对象的行为”为去掉const性质

我们去掉某个对象的const性质后,便可以对该对象进行写操作,如果此对象是一个常量,则使用const_cast执行写操作会产生未定义的后果

	const char *pc;						//底层const
	char *q = static_cast<char *>(pc); 	//错误,static_cast不能去掉const性质
	static_cast<string>(pc);			//正确,字符串字面值转换成string类型 
	const_cast<string>(pc);				//错误,const_char只改变常量属性 

补充:const_cast常常用于函数重载的上下文中

 

五、reinterpret_cast

看不懂!!!!!!!!!!!

 

posted @ 2017-10-12 12:20  GGBeng  阅读(251)  评论(0编辑  收藏  举报