类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制。可改变对象解释方式的运算符称为类型转换运算符。

为何须要进行类型转换

通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作,程序猿须要让编译器依照所需的方式解释数据,并成功编译和运行。一个非常经典的样例是:眼下非常多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的更多相关文章

  1. c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast  [版权声明]转载请注明出处 http://www.cnblogs.c ...

  2. C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

    C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...

  3. C++ static_cast dynamic_cast reinterpret_cast const_cast转换

    static_cast <type-id> ( expression ) 和C风格的类型转换相似,可以转换一个指针到基类,或者派生类.不做Run-time类型检查,这样转换并不总是安全的. ...

  4. static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较

    隐式转换(implicit conversion) ; int b; b=a; short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如 ...

  5. static_cast, dynamic_cast, reinterpret_cast, const_cast的区别

    static_cast最像C风格的强制转换,很多时候都需要程序员自身去判断转换是否安全.但是相对C风格的强制转换,在无关类的类指针之间转换上,有安全性的提升. dynamic_cast是运行时的转换吧 ...

  6. reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析

    reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...

  7. C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

    一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cs ...

  8. C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用

    1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...

  9. 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?

    [QQ群: 189191838,对算法和C++感兴趣可以进来]       开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...

随机推荐

  1. hdu 3635(并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  2. jQuery实现日期字符串格式化

    1. js仿后台的字符串的StringFormat方法 function StringFormat() { if (arguments.length == 0) return null; var st ...

  3. luogu P1340 兽径管理

    题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  4. MySQL类型转换 使用CAST将varchar转换成int类型排序

    --使用CAST将varchar转换成int类型排序 select distinct(zone_id) from guild_rank_info order by CAST(zone_id as SI ...

  5. Bluetooth篇 开发实例之七 匹配&UUID

    匹配和通信是两回事. 1.用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK中给出.但是可以通过反射来获取. 知道这两个API的 ...

  6. MySQL索引,如何正确创建MySQL索引?

    索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本.排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的 ...

  7. 如何使用Delphi编写Modbus RTU CRC16的校验码

    在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16.     而对CRC1 ...

  8. squid 三种代理实验

    squid 软件既可以做代理,也可以做实现缓存加速,大大降低服务器的I/O.. 1.其中squid代理分为三种,正向代理.透明代理.反向代理. (1)squid正向代理和squid透明代理都位客户端: ...

  9. vsftp 服务配置

    在CentOS或者RedHat Linux上有自带的ftp软件叫做vsftpd (very serure ftp) 搭建vsftpd 服务 yum 安装需要用两个包:vsftpd 和 db4-util ...

  10. Mac安装pstree

    brew install pstree pstree(选项) -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示: -c:不使用精简标示法: -G:使用VT100终端机的列绘图字符: -h ...