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++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...
随机推荐
- Fiddler抓包1-抓firefox上https请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6538021.html 前言 fiddler是一个很好的抓包工具,默认是抓http请求的, ...
- 系统封装的dispatch系列代码块引起的循环引用
整整一天的时间都在找内存泄漏,唯独遗漏了这个代码块,结果就是它,希望大家以后注意. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( ...
- POJ 3080-Blue Jeans【kmp,字符串剪接】
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20695 Accepted: 9167 Descr ...
- the-swift-programming-language 学习笔记
常量和变量 常量是定义是不可以修改的,在类中定义的常量,可以在构造函数中赋值.let修饰变量是可以修改的.var修饰字符串中字符的遍历for code in string {}for codeunit ...
- luogu P1072 Hankson的趣味题
题目链接 luogu P1072 Hankson 的趣味题 题解 啊,还是noip的题好做 额,直接推式子就好了 \(gcd(x,a_0)=a_1=gcd(\frac{x}{a_1},\frac{a_ ...
- bzoj 5346: tree (其实是是某次雅礼集训的题)
用prufer序列的公式直接dp,O(n^4)的算法简简单单就写出来了23333. 按理说 O(n^4)是需要优化成O(n^3)才能过的,然鹅我也不知道我怎么过了23333 (那就懒得优化了hhhhh ...
- [POI2013]Tower Defense Game
题目大意: 一个$n(n\le5\times10^5)$个点$m(m\le10^6)$条边的无向图,边权全为$1$,满足若一个标记点能覆盖与其距离不超过$1$的点,从中选取不超过$k$个点能将整张图覆 ...
- [POI2014]Criminals
题目大意: 给你一个长度为$n(n\le10^6)$的颜色序列,其中每个颜色互不相同.两个人$A$和$B$分别从某个点出发从左往右.从右往左任意地选择颜色,然后在中间的某一点相遇.分别给出两人所选择的 ...
- 韩国研发AI武器遭抵制,武器自带“头脑”将多可怕
禁止自主武器的开发,事实上并不妨碍人工智能技术的发展,也不妨碍其被正常用于军事领域,其中的关键就在于,人类是否拥有控制权,能否在关键时刻对其进行关闭. 文 |郑伟彬 转自新京报专栏 4月4日,全球超过 ...
- 自动化安装SQLSERVER和SQLSERVER补丁 转
2014-01-23 18:31 您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗? 介绍 假如你有50台服务器需要安装SQLSERVER,如果你用下一步下一步的方式,用远 ...