博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++编程知识分享:C++四种强制转换,教你多种类型转换方式!
阅读量:2442 次
发布时间:2019-05-10

本文共 1781 字,大约阅读时间需要 5 分钟。

 

C语言的强制转换为在数据面前之间加数据类型进行转换,即(目标数据类型)原数据类型。c++为了更好的区分强制转换的类型,达到见其名知其意的效果,共将强制转换分为四种,即

1、static_cast<目标数据类型>原数据类型

2、const_cast<目标数据类型>原数据类型

3、reinterpret_cast<目标数据类型>原数据类型

4、dynamic_cast<目标数据类型>原数据类型

解析

static_cast<>()

1)用于类层次结构中基类和派生类之间指针或引用的转换

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的

进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的

2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全由开发人员来保证

3)把空指针转换成目标类型的空指针

4)把任何类型的表达式转换为void类型

注意:static_cast不能转换掉expression的const、volitale或者__unaligned属性。

 static_cast:可以实现C++中内置基本数据类型之间的相互转换。

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。

const_cast<>()

cost_cast即用于强制转换指针或者引用的const或volatile限制,特别注意的是,const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。

常量指针被转化成非常量指针,并且仍然指向原来的对象;

常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

1、变量为常量,指针也为常量

结果:

2、变量为普通变量,指针为常量

结果:

reinterpret_cast<>()

reinterpret_cast运算符用于处理无关类型之间的转换,他会产生一个新的值,这个值会有与原始参数(原数据类型)有完全相同的比特位

从指针类型到一个足够大的整数类型

从整数类型或者枚举类型到指针类型

从一个指向函数的指针到另一个不同类型的指向函数的指针

从一个指向对象的指针到另一个不同类型的指向对象的指针

从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针

从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

dynamic_cast<>()

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

        基类中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于的概念,详细可见)中,

        只有定义了虚函数的类才有虚函数表。

(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

        向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。

       向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

        在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。

       “我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线和工具。如果感觉自学C/C++编程有困难的话可以湫湫扫下方二维码。这里是编程爱好者的聚集地,欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。

 

转载地址:http://ycnqb.baihongyu.com/

你可能感兴趣的文章
使用PostCSS改善CSS的质量
查看>>
静态方法创建静态map_如何使用Metalsmith创建静态站点
查看>>
面向对象的前端开发_20多种面向前端开发人员的文档和指南(第8号)
查看>>
wordpress git_Revisr-适用于WordPress的Git
查看>>
字体大小 像素_停止伤害身体:像素字体大小的危险
查看>>
ar foundation_Foundation和WordPress入门
查看>>
wordpress插件_审查的顶级WordPress SEO插件
查看>>
wordpress本地开发_WordPress提要开发人员指南
查看>>
Internet Explorer之后的前端开发
查看>>
wordpress 主机_如何将好的WordPress主机与坏的分开
查看>>
css 数字转换成字符串_快速提示:使用CSS和JS进行单字符转换
查看>>
sass导入sass_Sass中的数据类型
查看>>
wordpress 数据库_备份和还原大型WordPress数据库
查看>>
wordpress评论插件_WordPress评论插件的全面比较
查看>>
gulp-postcss_如何在Gulp中使用PostCSS
查看>>
svg 图标 小程序_可访问图标的SVG工作流程
查看>>
css border 渐变_用CSS Border Images装饰网络
查看>>
ar foundation_Foundation 6有什么新功能?
查看>>
前端工具:2015年我最喜欢的一些发现
查看>>
wordpress模板_WordPress模板层次结构
查看>>