隐式类型转换
隐式类型转换是指不需要程序员干预,编译器自动进行的类型转换。
隐式类型转换的原则
1.类型兼容
2.由向字节长度增加的方向进行(保证精度不丢失)
3.由存储方式简单向复杂方向进行
4.自定义对象可以由子类向父类隐式转换
隐式类型转换的情况
1.如果参与运算的数据类型相同,那么结果也为该类型。
2.如果参与运算的数据类型不相同,先转化为相同类型,再进行计算。
如果是同一家族的数据类型,取原则2;如果是不同家族的数据类型,取原则3。
3.赋值运算时,尝试将右值转化为左值类型。
4.指针的转换:NULL指针可以转换为任意类型指针;任意类型指针可以转换为void指针;指针向上提升:一个派生类的指针可以被转换为一个可访问的无歧义的基类指针,不会改变它的const或volatile属性。
5.自定义对象子类可以隐式转换为父类对象
隐式转换的例子
//bool char (size_t) short int (long) (long long) float double (struct) (class)
bool b=5;//非零数转为true
b=0;//零转为false
int a=true;//结果为1
a=false;//结果为0
char ch='A'+true;//结果为B
ch='A'+false;//结果为A
short sa=200;
int ia=sa;//short类型的sa隐式转化int类型的数据赋给ia
double db= ia;//int类型的数据转化为double
double dl='A'+true;//'A'转化为65,true转化为1,dl=66.0000...
int *ptr=NULL;//NULL被转化为int*类型
void* vptr=ptr;//ptr被转化为void*类型
//......
(建议)基本类型转化时:用已知的知识尝试将类型转化为int再向其它类型进行转换。例如char-int-bool等类型的互换。(原理:Ascii码标准转换与布尔类型与整型int的转换原则)
隐式类型转换的限制
1.不兼容不可转
2.“类”类型受函数限制
·单参数构造函数:允许隐式转换特定类型来初始化对象
·赋值操作符:允许从特定类型的赋值进行隐式转换
·类型转换操作符:允许隐式转换到特定类型
没有以上三个函数,类不允许转换类型
既然隐式转换存在这么多的风险,那如何能够禁止隐式转换的发生呢。C++中提供了explicit关键字,在构造函数声明的时候加上explicit关键字,能够禁止隐式转换。使用方法如下:
class Test
{
explicit Test( int a);
//……
}
显示类型转换
显示类型转换又被称为强制类型转换。
强转的转换方式
double db=2.00;
int a=(int)db;//类c型->c-like cast notation
int c=int(db);//函数型->functional notation
//第一种是延续C语言风格的类型转换,所以叫做类C型
//第二种是C++支持的,建议使用第二种
C++引入的四种类型转换
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
关于类型转换的知识: cplusplus.com/doc/tutorial/typecasting/https://cplusplus.com/doc/tutorial/typecasting/
感谢大家