隐式转化
先来看下面这条表达式,它的目的是将ival初始化为6:
int ival=3.541+3; //编译器可能会警告该运算损失了精度
加法的两个运算对象类型不同,3.541的类型是double,3的类型是int。C++语言不会直接将两个不同类型的相加,而是根据类型转换规则设法将运算对象的类型统一后再求值。上述的类型转换时自动执行的,无须程序员介入,有时候甚至不需要程序员了解,因此,我们称之为隐式转换。
因为 C++定义了算术类型之间的内置转换以尽可能防止精度损失,所以这里3转换为double型相加得6.451。但是下一步赋值的时候,右操作数进行截断处理,对此精度会有损失,编译器也会给出警告。在函数调用时也会发生隐式类型转换,具体的转换细节可参见本节。
常见隐式转化
算术转换
1.对于bool, char,signed char, unsigned char,short, unsigned short等类型来说,它们都有可能通过整型提升变为int型。如:
a:false提升成了0,true提升了为1
b:
3.14159L+‘a’;
在这个加法运算中,小写字母‘a’是char型的字符常量,它其实能表示一个数字值,到底这个数字值是多少完全依赖于机器上的字符集。当把‘a’ 和一个long double类型的数相加时,char的值首先被提升成int,然后int 类型的值再转化为long double
c:
假如两个类型分别是 unsigned int 和 int,则int类型的运算对象会转换为unsigned int
数组转换为指针
在大多数用到的数组表达式中,数组自动转换为指向数组首元素的指针:
int ia[10]; /*含有10个整数的数组*/
int *ip=ia; /*ia转换成指向数组首元素的指针*/
指针的转换
1.转换为布尔类型
char *cp=get_string();
if(cp) /*... */ //如果cp不为0,则条件为真
while(*cp) //如果*cp不是空字符,则条件为真
2.转换成常量
int i;
const int &j=i; //非常量转换const int的引用
const int *p=&i; //非常量的地址转换成常量的地址
int &r=i, *q=p;//错误:不允许const转换为非常量
3.类类型的转换:
string s;
while(cin>>s)
这里隐式使用了IO标准库定义的类型转换,返回的是cin,此处将istream类型的值转换为bool类型,意味这要检验流的状态,如果读取成功,返回true,如果失败,比如说读取到文件的末尾,那么转换为bool后为false;循环条件不成立