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++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...
随机推荐
- 关于ScrollView嵌套RecyclerView出现item显示不全的问题
最近使用ScrollView时,发现里面嵌套Listview显示不全,试过重写Listview的onMeasure(),并没有起作用.然后将ListView换成RecyclerView后,高度还是显示 ...
- Struts2 学习笔记——struts.xml文件之Bean的配置
Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...
- POJ 1044: Date bugs
题目描述 There are rumors that there are a lot of computers having a problem with the year 2000. As they ...
- Java里如何判断一个String是空字符串或空格组成的字符串
要判读String是否为空字符串,比较简单,只要判断该String的length是否为0就可以,或者直接用方法isEmpty()来判断. 但很多时候我们也会把由一些不可见的字符组成的String也 ...
- #请用索引取出下面list的指定元素:
#!/usr/bin/python # -*- coding: utf-8 -*- L = [ ['Apple', 'Google', 'Microsoft'], ['Java', 'Python', ...
- POJ 2686 Traveling by Stagecoach(状压DP)
[题目链接] http://poj.org/problem?id=2686 [题目大意] 给出一张无向图,你有n张马车票每张车票可以租用ti匹马, 用一张马车票从一个城市到另一个城市所用的时间为这两个 ...
- 最近公共祖先LCA Tarjan 离线算法
[简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...
- Android Studio+WebApi(一)属于我们自己的App
AndroidStudio(以后都简称AS),作为google的亲儿子,终于出了个像样的android ide,再也不用在eclipse中又是Adt,又是这又是那的,一大堆的集成了.废话不多说,这个系 ...
- 【IntellJ IDEA】idea的Terminal窗口中文乱码 解决方法
在操作git命令在windows上的idea中的terminal窗口时,总是出现中文乱码的问题 本开始以为是git乱码的问题,如果是GIt中文乱码,解决方案:https://www.cnblogs.c ...
- .NET Core简介
内容主要来源 https://docs.asp.net/en/latest/conceptual-overview/dotnetcore.html 什么是.NET Core .NET Core 5 包 ...