static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别
static_cast
1. 基础类型之间互转。如:float转成int、int转成unsigned int等
2. 指针与void*之间互转。如:float*转成void*、CBase*转成void*、函数指针转成void*、void*转成CBase*等
3. 派生类指针【引用】转成基类指针【引用】。如:Derive*转成Base*、Derive&转成Base&等
4. 非virtual继承时,可将基类指针【引用】转成派生类指针【引用】(多继承时,会做偏移处理)。如:Base*转成Derive*、Base&转成Derive&等
dynamic_cast 专门用于处理多态机制,对继承体系内的对象(类中必须含有至少一个虚函数)的指针【引用】进行转换,转换时会进行类型检查;vc在编译时要带上/EHsc /GR
如果能转换会返回对应的指针【引用】;不能转换时,指针会返回空,引用则抛出std::bad_cast异常(const std::bad_cast& e)
注:由于std::bad_cast类型定义在typeinfo头文件中,固需要#include<typeinfo>
另外,对于菱形非virtual继承、非public继承,转换引用时也会抛出std::bad_cast异常
reinterpret_cast 对指针【引用】进行原始转换,不做任何偏移处理(当然:多继承时,也不会做偏移处理)
1. 将指针【引用】转换成整型。如:float*转成int、CBase*转成int、float&转成int、CBase&转成int等
2. 指针【引用】之间互转。如:float*转成int*、CBase&转成int、CBase*转成CBase2*、CBase&转成CBase2&等
const_cast 去掉或增加const、volatile特性
C类型强制转换 形式:(type)object或type(object)
最好是使用type(object);原因是:在某些编译器下,(type)object不会调用构造函数,而type(object)下则肯定会调用构造函数
C类型强制转换会按照以下顺序进行尝试转换:
a. const_cast
b. static_cast
c. static_cast, then const_cast
d. reinterpret_cast
f. reinterpret_cast, then const_cast
static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别的更多相关文章
- 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的区别
static_cast最像C风格的强制转换,很多时候都需要程序员自身去判断转换是否安全.但是相对C风格的强制转换,在无关类的类指针之间转换上,有安全性的提升. dynamic_cast是运行时的转换吧 ...
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion) ; int b; b=a; short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如 ...
- as和强制类型转换的区别
之前一直以为as就是强制类型转换,只是as是AS3中新的语法,之前用在有继承关系的对象之间的转换也无甚区别,但是今天却让我领悟到了它俩之间的区别. 原起:今天要给ColorPicker控件动态赋值,它 ...
- c#中convert.toInt32和int.parse()和强制类型转换的区别
string a="123"; int i=(int)a; 这是会出现错误因为:强制类型转换只能转换值类型不能转换引用类型 string属于引用类型 强制类型转换时如果值类型 ...
- c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]
前言 使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别. 答案是肯定不是的. 正文 看两段代码: object o = Factory.GetObject(); Student stude ...
- reinterpret_cast,static_cast, dynamic_cast,const_cast的运用分析
reinterpret_cast(重新解释类型转换) reinterpret_cast 最famous的特性就是什么都可以,转换任意的类型,包括C++所有通用类型,所以也最不安全 应用 整形和指针之间 ...
随机推荐
- PyQt4关闭最大化最小化取消双击最大化
self.setWindowFlags(Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint | Qt.CustomizeWindowHi ...
- vmware-question
1.网卡修改序号ip link set eth3 name eth02.解决克隆虚拟机后网卡设备无法识别启动问题的方法******************************/etc/udev/r ...
- No handlers could be found for logger "keystoneauth.identity.generic.base"
一般是因为发现了多个keystone的url造成的.
- hdu1520
基本的树形dp #include <cstring> #include <cstdio> #include <vector> using namespace std ...
- ios 引入第三方库 运行时找不到函数实现
今天引入webtrends 这个库,结果一直运行时找不到函数,纳闷了一下午! 后来发现,是other flag没有设置对,对于那些包含category用来扩展ios原始类型的库,链接的时候需要特别的链 ...
- ACM/ICPC 之 SPFA-兑换货币(POJ1860)
//水题-SPFA解法 //套汇是指兑换货币后能使本金上升 //给定本金货币编号,货币间的汇率和手续费,求能否套汇成功 //Time:16Ms Memory:200K #include<iost ...
- Java for LeetCode 236 Lowest Common Ancestor of a Binary Tree
解题思路一: DFS到每个节点的路径,根据路径算出LCA: public class Solution { public TreeNode lowestCommonAncestor(TreeNode ...
- SAP打印出库单需求
*&---------------------------------------------------------------------* *& Report Z_SD_CKD ...
- Excel保护工作表
最近见到一个Excel文件,其中的表不能选中,不能编辑,今天研究了一下 明白了其设置方法 excel中开始--格式--保护工作表--去掉所有勾选,输入保护密码 即可
- 【转】Java-----jar反编译修改重新打包
原文链接:http://blog.csdn.net/hekewangzi/article/details/44676797 一.使用反编译工具JD-GUI(JD-GUI相关操作见Java-----反编 ...