由”野蛮转换“联想而来,无意中看到一个类类型转换的例子,称之为野蛮转换,我们先看一下什么样的一个”野蛮转换“,再来详细的梳理下类型转换这个非常重要的章节。
e.g.1:
上面的一个例子是个人感觉是一个经典的例子,因为涉及到了指针,那又涉及到类类型的转换,那结果就是类类型转换以后,指针指向的问题。此处先不详细介绍这个类类型转换到底怎么指向的,只是在此处做一个引入。
e.g.2
这也是一个类型转换,输出到底是什么?类型转换的形式到底有哪些,这些又是什么样的。接下来将详细介绍类型转换的问题。
类型转换
1:隐式转换
1.1、隐式转换:某些转换规则由编译器自动执行,无需程序员介入。
规则:(1)C++中定义了算数类型之间的内置转换尽可能防止精度丢失。通常如果表达式中操作数分别为整型和浮点型,则整型的操作数被转化为浮点型。
(2)在赋值操作中,不可能更改左值操作数对象的类型,因此左操作数的类型占主导地位。如果左右操作数的类型不相同,则右操作数会转换为左边的类型。
(3)算数转换:
算数转换是C++语言内置类型提供的一组转换规则,也是最常用的一组转换规则。它能够将二元操作符(如算术和逻辑操作符)的两个操作数转换为同一类型,并使得表达式也具有相同的类型。
最简单的转换:整型提升,
1.2、什么情况下会发生隐式转换?
(1)在混合类型的表达式中,其操作数被转换为相同的类型。
int ival;
double dval;
ival >=dval;
(2)用作条件表达式被转换为bool型
int ival;
if(ival)
while(cin)
(3)用一个表达式初始化某一个变量,或将一表达式赋值给某个变量,则该表达式被转换为该变量的类型。
int ival=3.14;//3.14转换为int型
int *p;
p=0;//将0转换为空指针
整型提升:对于所谓比int小的类型,包括char、signed char、unsigned char、short和unsigned short,这些类型都是包含于int内的,所以进行转换时可以进行提升为int
(4)有符号与无符号之间的转换
如果表达式中使用了无符号数组,所定义的转换规则需要保护操作数的精度。unsigned操作数的转换依赖于机器中整型的相对大小。
当在表达式中,如果出现了有符号类型的和无符号类型的,那所有的有符号类型都自动转换成无符号类型。这样有符号的数就转换成一个很大的数。
1.3 其他的隐式转换
(1)指针转换
在使用数组时,大多数情况下都会自动转换为指向第一个元素的指针
(2)转换为bool类型
算术值和指针值都可以转换为bool类型
(3)算术类型与bool类型的转换
可将算数对象转换为bool类型,bool对象也可以转为int类型
(4)转换与枚举类型
(5)转换为const对象
(6)由标准库类型定义的转换
比如:
string s;
while(cin>>s)
这里使用了隐式的IO标准库定义的类型转换。
2:显式转换
double dval;
int ival;
ival *= dval; //ival=ival*dval
为了与dval做乘法操作,首先将ival转换为double型,然后将乘法操作的double型结果截尾为int 型,在赋值给ival。
为了去掉ival转换为dval这个不必要的操作,可以强制将dval转换为ival类型:
ival *= static_cast<int>(dval);
命名的强制类型转换:
原型:
cast_name<type>(expression);
cast_name:
(1)dynamic_cast
支持运行时识别指针或引用所指向的对象
(2)const_cast
转换掉表达式const性质
(3)static_cast
编译器隐式执行的转换都可以用static_cast显式的完成
(4)reinterpret_cast
通常为操作数的位模式提供较低层次的重新解释。
旧式强制类型转换
char *pc = (char*) ip;
开头的例子很好的解释了这种类型转换