讲解类型转化----C++

隐式转化

隐式转化是自动执行的,不需要程序员的介入,有时甚至不需要程序员了解。
举个例子:

int ival = 3.555 + 3

加法的两个运算对象的类型不同,3.555为double类型,而3是int型,C++不会将两个不同类型的值直接想加,而是根据类型转换规则将两个类型统一之后再求值,在这个例子中,3被提升为double型,然后两个double型想加,最后再转化为int型。
何时发生类型转换

  • 在大多数情况下,比int型小的整数值首先提升为较大的整数类型
  • 在条件中,非bool类型转换为bool类型
  • 初始化过程中,初始值转换成变量的类型
  • 赋值语句中,右侧对象的类型转换为左侧对象的类型
  • 如果算术运算或者关系运算中对象有多种类型,要转换为同一种类型
  • 函数调用时,也会发生类型转化

算术转换

算术转换的含义是把一种算术类型转换为另一种算术类型,算术转换定义了一套类型转换的层次。
类型提升
类型提升负责把小整数类型转换为较大的整数类型,对于bool、char、signed char、unsigned char、short以及unsigned short类型来说,只要它们存在int里,他们就会提升为int型,就如我们所知的false提升为0,true提升为1。
另外如果想深入了解算术转换,只需要在敲一下测试代码然后在编译器里观察一下就好。

其它类型的隐式转换

除了算术类型转换之外,还有几种隐式转换,包括如下。
数组转换为指针
大多数用到数组的表达式中,数组自动转换为指向数组首元素的指针。

int a[10];
int *ptr = a;   //a自动转换为指向数组首元素的指针

指针的转换
C++规定了几种其他的指针转换方式,包括常量整数值0或者字面值nullptr能转换为任意指针类型,指向任意非常量的指针能转换成void*;指向任意对象的指针能转换为const void*。
转换为布尔类型
存在一种从算术类型或指针类型转换成布尔类型的自动转换机制,如果指针或者算术类型的值为0,转换为false,否则转换为true,所以我们会看到如下表达式合法:

if(ptr)  //这里ptr为一个指针,ptr转换为bool类型
{
   //TODO
}
if(m)  //这里m为int类型,转换为bool类型
{
   //TODO
}

非常量转换为常量
允许将一个指向非常量的指针转换为指向相应的常量指针,对于引用也是如此,不过,值得注意的是,反过来非法。

显式转换

命名的强制类型转换
主要分为4种,分别是static_cast,dynamic_cast,const_cast,reinterpret_cast,以下做详细讲解。

  • static_cast
    任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast,例如,将一个运算对象强制转换为double类型就能使表达式执行浮点数除法:
double d = static_cast<double>(j) / i;

当需要把一个较大的算数类型赋值给一个较小的类型时,static_cast就非常有用,相当于告诉编译器我们不在乎精度的损失。
另外,static_cast对于编译器无法执行的类型转换也会非常有用,例如没我们可以用static_cast找回存在于void*的指针中的值:

void* p = &d;
double *dp = static_cast<double*>(p);
  • const_cast
    const_cast只能改变对象的底层const,对于将常量转换为非常量对象的行为,我们一般称为“去const性质”,如果我们去掉const,编译器便不能阻止我们进行写操作了。
    只有const_cast能改变表达式的常量属性,它常用于有函数重载的上下文中。

  • reinterpret_cast
    reinterpret_cast 通常为运算对象的位模式提供较低层次的重新解释。这个不介意使用。

  • dynamic_cast
    dynamic_cast运算符的使用形式如下:

dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)

type必须是一个类类型,并且通常情况下该类应该有虚函数,第一种情况下e必须是一个有效的指针,第二种情况下,e为一个左值,第三种情况下,e不能是左值。
另外,e还有别的要求,e必须满足以下三点的其中一点,否则,转换失败

  1. e的类型为type的公有派生类
  2. e的类型为目标type的公有基类
  3. e的类型就是目标type的类型
    举个例子,指针类型的dynamic_cast
    假定Base类至少有一个虚函数,Derived是Base的公有派生类,如果有一个指向Base的指针bp,则我们可以在运行时将它转换成转换为指向Derived的指针,代码如下
if(Derived *dp = dynamic_cast<Derived*>(bp))
{
   //使用dp指向Derived对象
}
else
{
   //使用bp指向Derived对象
}

转换成功则可以使用dp指向Derived对象,否则要使用bp。
旧式的强制类型转换
早期的C++包含以下两种形式:

type(expr);//函数形式的强制类型转换
(type)expr;//c风格的强制类型转换,这种见的比较多

举个例子

char *p = (char*) ip; //ip为指向int型的指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“Modern C”(现代C)是一本由王桂林编写的C语言教材。C语言作为一种广泛应用于软件开发行业的编程语言,常常被认为是一门必学的语言。王桂林老师在他的教材中将C语言的教学理念与现代软件开发的实际需求结合在一起。 王老师的“Modern C”与传统的C语言教材不同之处在于,他注重引导学生了解并掌握C语言在现代软件开发中的应用。教材以清晰的演示和实例展示C语言的基本概念和语法,并与实际应用相结合。通过实践性的编程作业和项目,学生可以更好地理解和应用所学的知识。 王老师在教学中还注重培养学生的编程思维和解决问题的能力。他鼓励学生通过对现实问题的抽象和建模,将其转化为计算机程序来解决。他强调了程序设计的方法论和规范,帮助学生养成良好的编程习惯。 此外,王老师还介绍了一些现代软件开发中常用的工具和技术,如版本控制系统Git、集成开发环境等。这些工具和技术在实际项目中扮演重要的角色,能够提高开发效率和质量。 总而言之,“Modern C”是一本注重实践和应用的C语言教材,兼顾了基础知识的讲解和现代软件开发的需求。王桂林老师的教学理念和丰富的实践经验使其对学生学习C语言和提升编程能力非常有帮助。无论是初学者还是有一定经验的开发者,都可以从中受益并在软件开发领域中取得进步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值