数据类型转换

隐式类型转换

隐式类型转换是指不需要程序员干预,编译器自动进行的类型转换。

隐式类型转换的原则

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/icon-default.png?t=N7T8https://cplusplus.com/doc/tutorial/typecasting/


感谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值