C/C++学习笔记28:类型转换

由”野蛮转换“联想而来,无意中看到一个类类型转换的例子,称之为野蛮转换,我们先看一下什么样的一个”野蛮转换“,再来详细的梳理下类型转换这个非常重要的章节。

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;
开头的例子很好的解释了这种类型转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值