C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制。可改变对象解释方式的运算符称为类型转换运算符。
为何须要进行类型转换
通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作,程序猿须要让编译器依照所需的方式解释数据,并成功编译和运行。一个非常经典的样例是:眼下非常多C++程序依旧在使用非常多年前用C编写的库。而针对这些C语言编译器编写的库必须依赖整形来保存布尔值,因此对于这些编译器来说。bool类型的定义就类似于:
typedef unsigned short BOOL,返回布尔值的函数可能这样声明:BOOL IsX()
而C++编译器支持bool,单位false和true。假设在新的C++应用程序中使用这种库,程序猿必须让其使用的C++编译器可以理解数据类型bool,同一时候让库可以理解数据类型bool,因此,可使用类型转换:bool bCPPResult = (bool) IsX();非常明显这是C风格类型转换。而纯粹的C++语法论者觉得这种转换不伦不类,推崇纯粹的C++风格类型转换。
C++ 类型转换运算符
static_cast。dynamic_cast,reinterpret_cast。const_cast
全然同样的语法:destination_type result = cast_type <destination_type>(object_to_be_casted)
static_cast :
静态类型转换,实现编译阶段检查。确保指针转换为相关类型。可用于相关类型的指针之间进行转换,还可显式地执行标准数据类型的类型转换。在C语言中可将一个对象的指针转换为全然不相关的类型,而编译器不会报错。而是用static_cast则会对指针相关性进行检查,假设不相关,则编译器会报错。同一时候static_cast能够实现指针向上转换为基类类型。向下转换为派生类型,但不会在执行阶段执行检查。
而通常向下转换为派生类型时,在执行阶段会有可能导致意外结果。因此便有了以下的动态类型转换。
dynamic_cast:
动态类型转换,在执行阶段执行类型转换,可检查操作结果,假设为NULL则转换失败。所以採用动态类型转换,一定要进行指针的推断。这样的在执行阶段识别对象类型的机制称为执行阶段类型识别(RTTI。runtime type identification)
reinterpret_cast:
属于强制类型转换。与C风格类型转换最接近。不进行相关性推断,强制编译器接收static_cast通常不同意的类型转换。一般用于低级的驱动程序。一般不使用这样的方式。
const_cast:
让程序猿可以关闭对象的訪问修饰符const。通常改动因为使用const引用来调用non-const成员函数编译导致的错误,利用const_cast把const引用转变为non-const引用,然后就行顺利的编译和运行。
C++ 类型转换运算符存在的问题
在现代C++中,除了dynamic_cast之外的类型转换都是能够避免的。仅当须要满足遗留应用程序需求时。才须要使用其它类型转换运算符。
重要的是,一旦使用类型转换。务必要知道幕后发生的情况。
在使用中应牢记:将派生类转换为基类类型叫做向上转换。是安全的;将基类类型转换为派生类类型叫做向下转换。除非使用dynamic_cast否者是不安全的。请牢记,创建继承层次结构时。应尽量将函数声明为虚函数,这样通过基类指针调用这些函数时,假设该指针指向的是派生类对象,将调用对应类的函数版本号;在使用dynamic_cast别忘了对指针进行检查。看其是否有效。
C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast的更多相关文章
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.c ...
- C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...
- C++ static_cast dynamic_cast reinterpret_cast const_cast转换
static_cast <type-id> ( expression ) 和C风格的类型转换相似,可以转换一个指针到基类,或者派生类.不做Run-time类型检查,这样转换并不总是安全的. ...
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion) ; int b; b=a; short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如 ...
- static_cast, dynamic_cast, reinterpret_cast, const_cast的区别
static_cast最像C风格的强制转换,很多时候都需要程序员自身去判断转换是否安全.但是相对C风格的强制转换,在无关类的类指针之间转换上,有安全性的提升. dynamic_cast是运行时的转换吧 ...
- reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析
reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...
- C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cs ...
- C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用
1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...
- 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?
[QQ群: 189191838,对算法和C++感兴趣可以进来] 开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...
随机推荐
- vs2015 建立项目报错:值不能为空,参数名:path1的错误解决与“未将对象引用到对象的实例”
“值不能为空,参数名:path1” 的错误.原因就是安卓sdk的路径不正确. 最简单的解决办法如下: 找到C:\Program Files (x86)\Android\android-sdk.进入文件 ...
- 关于Date数据类型格式化的转换
例如: jsp页面读取数据库中日期格式的列时可能显示为1988-05-03 00:00:00 格式,但是我们不想要后面的00:00:00时间,只想要前面的年月日,那么该如何做出修改呢? 方法一:我 ...
- Extjs Ext.grid.column.Column 隐藏显示列
1.根据字段名字 grid.down("gridcolumn[dataIndex=PLAN_QTY]").show();//hide() 2.根据列号 grid.columns[1 ...
- 使用ubifs格式的根文件系统---过程记录
配置内核,使其支持ubifs文件系统 1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Uns ...
- Understanding Memory Technology Devices in Embedded Linux
转: NAND Chip Drivers NAND technology users such as USB pen drives, DOMs, Compact Flash memory, and S ...
- 【Spark】SparkContext源代码解读
SparkContext的初始化 SparkContext是应用启动时创建的Spark上下文对象,是进行Spark应用开发的主要接口,是Spark上层应用与底层实现的中转站(SparkContext负 ...
- 阿里云ECS服务器IIS和WampServer同时运行
网上下载WampServer安装包 安装完成之后默认的端口是80 但是由于此端口被IIS占用了 点击WampServer的图标->Apache->Service->测试80端口 出现 ...
- ASP.NET MVC学习---(四)MVC初窥
前面三篇大幅度的介绍了EF框架 这并不是没有道理的 现在使用mvc开发一般都离不开ef 因为它们相结合可以为你带来完美的体验 当然 前面所描述的仅仅是ef框架的冰山一角 它是一门学问很深的功课 如果你 ...
- zookeeper安装和使用
Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 1.下载地址 https://mirrors.cnnic.cn ...
- tomcat修改默认访问首页
找到conf下server.xml文件修改如下位置内容 <Host name="localhost" appBase="webapps" unpackWA ...