热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

c++显式类型转换示例详解

这篇文章主要介绍了c++显式类型转换示例详解,需要的朋友可以参考下

标准C++包含一个显式的转换语法:

static_cast:用于“良性”和“适度良性”的转换,包括不用强制转换

const_cast:用于“const”和/或“volatile”进行转换

reinterpret_cast:转换为完全不同的意思。为了安全的使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这是所有转换中最危险的。

dynamic_cast:用于类型安全的向下转换

-----常用-----

static_cast:用于所有明确定义的转换,包括void*的强制转换、隐式类型转换、类层次的静态定位。

1. 数据类型由小到大的转换,比如int转换为long或float;

代码如下:

int i ; static_cast(i); static_cast(i);

2. 窄化转换,即数据类型由大到小的转换,可能丢失数据;

3. c++中是不允许对一个void*类型的数据赋值的;

代码如下:

void* ptr;  ptr = static_cast(i);


const_cast:常量转换,如果从const转换为非const或从volatile转换为非volatile,可以使用const_cast。这是const_cast唯一允许的转换。
代码如下:

volatile int k = 0;   int* u = const_cast(&k);


四种显式的类型转换使用示例

1、reinterpret_cast
类型转换函数将一个类型的指针,转换为另一个类型的指针。这种转换不需要修改指针变量值数据存放格式,只需在编译时重新编译解释指针的类型就可。

代码如下:

double d=9.3;
double *pd=&d;
int *pi=reinterpret_cast(pd);

但是不能用于非指针类型的转换。
同隐式转换一样,reinterpret_cast也不能将一个const指针转换为void*指针。

2、const_cast
用于去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量。也可以将一个非常量的指针变量转换为一个常指针变量,在编译期间做出类型更改。

代码如下:

const int* pci=0;
int* pj=const_cast(pci);

基于安全性的考虑,const_cast无法将非指针的常变量转换为普通变量。
可以将普通指针变量pi转换为常指针变量,但不能将非指针的普通变量转换为常变量。

3、static_cast
用于基本类型之间和具有继承关系的类型之间的转换,这种转换一般会更改变量的内部表示方式。用于指针类型转换,没有太大意义。

代码如下:

class Base();
class Derived:public Base{}
Derived d;
Base d=static_cast(d);

可将继承类对象转换为基类对象。但是反过来不行。
注意:基类指针转换为继承类指针,在一定的危害性。

4、dynamic_cast
与static_cast相对,是动态dynamic_cast转换。这种转换是在运行时进行转换分析的,并非在编译时进行。只能在继承类对象的指针之间或引用之间进行类型转换。进行转换时,会根据当前(RTTI)判断类型对象之间的转换是否合法。dynamic_cast转换失败,是通过是否为null指针检测;引用转换失败,抛出bad_cast异常。
将继承类指针或引用转换为基类指针或引用可以,反过来一般不行;但是如果基类中有虚函数也可以,也就是说被转换的类具有虚函数的对象指针时,编译也通过。

代码如下:

class Base();
class Derived:public Base{}
Derived *pd=new Derived;
Base *d=dynamic_cast(pd);

此外,如果没有继承关系,但是被转换的类具有虚函数的对象指针时,转换也可编译通过。
代码如下:

int i;
long m;
m=static_cast(i);
const int i=0;
int* j=(int*)&i;
j=const_cast(&i);//将const型转换成volatile.

代码如下:

#include "iostream"
using namespace std;
const int sz=100;
struct X
{
int a[sz];
};
void print(X* x)
{
for(int i=0;icout<a[i]<<' ';
cout<}
int main()
{
X x;
print(&x);
int* xp=reinterpret_cast(&x);//cast &x to int*
for(int* i=xp;i*i=0;
//cannot use xp as an X* at this point usless you cast it bakc;
print(reinterpret_cast(xp));
print(&x);
return 1;
}


推荐阅读
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 距离11月的软考还有不到五个月的时间,考试将于11月5日至6日举行。许多朋友对软考的具体情况还不太了解:它是什么?有何用途?本文将为你详细解答。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
author-avatar
yeyeye
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有