C++转型操作符
转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html
旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷,表现在以下两方面:
不能更精确地指明其转型的意图。
如将一个pointer-to-base-class-object 转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to-non-const-object(改变对象的常量性),在旧式C语法中并不区分。
难以辨识。
旧式C转型方式的语法为(type)expression,由一对小括号加上一个对象名称组成,而这种语法结构在C++的任何地方都有可能使用,这就无法很直观地判断出是否是转型操作。
为解决上述的缺点,C++引入4个新型转型操作符,分别为:
static_cast, const_cast, dynamic_cast, reinterpret_cast
语法为: ***_cast<type> (expression).
下面着重解释四个新型操作符的用途:
static_cast: 基本与拥有与C旧式转型相同的威力与意义,以及相同的限制。如:
//计算两个int型数相除,结果为double型int firstNum, secondNum;double res = (double)firstNum / secondNum; //旧式C语法double res = static_cast<double>(firstNum) / secondNum; //新式C++转型符
const_cast: 用来改变表达式中的常量性(constness)或易变性(volatileness)。如:
int num;const int *cpNum = #int *pNum = cpNum; //error:cannot convert from 'const int *' to 'int *'int *pNum = (int *)cpNum; //旧式Cint *pNum = const_cast<int *>(cpNum); //新式C++ const_cast移除常量性
dynamic_cast: 用来执行继承体系中“安全的向下转型或跨系转型动作”。如:
//可以利用dynamic_cast将“指向base class object 的pointer或reference”转型为“指向derived class object的pointer或reference”//如果转型失败,会以一个null指针或一个exception 表现出来class CBase { }; //基类class CDerived: public CBase { }; //继承类CDerived dc;CDerived *dp = &dc;CBase *bp = dynamic_cast<CBase *>(dp); //使用dynamic_cast将指向继承类的指针转化为指向基类的指针CBase &br = dynamic_cast<CBase &>(dc); //使用dynamic_cast将指向继承类的引用转化为指向基类的引用
reinterpret_cast: 最常用的用途是转换"函数指针"类型。如:
typedef void (*funcPtr)(); //funcPtr是个无参数返回值为void型的函数指针类型int iFunc(){return 0;} //iFunc为一个无参数返回值为int型的函数void func(funcPtr f){} //func函数的参数是一个类型为funcPtr类型的函数指针main(){func(iFunc()); //error:cannot convert parameter 1 from 'int' to 'void (__cdecl *)(void)'func(reinterpre_cast<funcPtr>(iFunc); //right! reinterpre_cast将返回值为int 的函数转化为 返回值为void 的函数}
C++转型操作符的更多相关文章
- 【M2】最好使用C++转型操作符
1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...
- C++中的四种转型操作符
在具体介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它差点儿同意将不论什么类型转换为不论什么其它类型,这是十分拙劣的.假设每次转型都可以更精确地指明意图,则更好. ②旧式转型难以辨 ...
- 5.9 C++重载转型操作符
参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...
- 新式转型操作符[条款9] --《C++必知必会》
在旧式转型(cast)下面隐藏着一些见不得人的.鬼鬼祟祟的东西.他们的语法形式使其在一段代码中通常很难引起人们的注意,但它们可能会搞一些可怕的破坏活动,就好比你冷不丁被一个恶棍猛击一拳似的.让我们阐明 ...
- 【More Effective C++ 条款2】最好使用C++转型操作符
C的转型方式存在以下两个缺点: 1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全 如将一个pointer-to-base-class-object转型为一个pointer- ...
- C++ 之 新式转型操作符
四种新式转型: const_cast.dynamic_cast.reinterpret_cast.static_cast!! 1.const_cast : 去除常量性 2.dynamic_cast ...
- 条款二:最好使用c++转型操作符
一.static_cast基本上拥有与c旧式转型相同的威力与意义,以及相同的限制,不能够移除表达式的常量性,const_cast负责这个功能 二.const_cast用来改变表达式中的常量性,如果将c ...
- CLR via C#(08)-操作符
对于操作符,我们并不陌生,例如+,-,*,%等二元操作符,以及++,!等一元操作符.但是对于非基元类型,我们需要通过一些自定义方法才能使用这些操作符.今天主要和大家分享关于操作符重载和转换操作符的知识 ...
- C# 数据类型转换 显式转型、隐式转型、强制转型
C# 的类型转换有 显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问 ...
随机推荐
- [Docker] Linking Node.js and MongoDB Containers
To do communcation between containers, we need to do link between containers. 1. Run a container wit ...
- UltraISO制作U盘启动盘安装Win7/9/10系统攻略
U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...
- [Canvas]用透明PNG图在背景上画前景能不遮挡背景
欲看动态效果请点击下载并用Chrome/Firefox浏览器打开index,html. 图例: 从效果可以明显的看到,五角星边缘和中心都没有对背景遮挡. 代码: <!DOCTYPE html&g ...
- HTTP 响应实体主体:XML 及 XML parser
本文内容 HTTP 响应实体主体:XML XML parser 总结 各编程语言实现的 XML parser HTTP 响应实体主体:XML 实体主体(entity-body)通常是HTTP响应里 ...
- Maven教程初级篇02:pom.xml配置初步
1. 创建项目并更改项目基本配置信息 在命令行下运行如下命令创建一个项目: 1 mvn archetype:create -DgroupId=net.jianxi.tutorials 2 ...
- Postgresql中的数据类型大全
一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...
- WEB打印控件Lodop使用体会
控件的使用方法,作者都已经有详细的使用说明供使用者参考. 但是对于打印表格,确实出现一点小问题,如果表格是自然高度,也就是只设置了table的高度,此时是可以正常显示的 ...
- MySql绿色版安装步骤和方法,以及配置文件修改,Mysql服务器启动
MySql绿色版Windows安装步骤和方法,以及配置文件修改,Mysql服务器启动 支持“标准”Markdown / CommonMark和Github风格的语法,也可变身为代码编辑器: 支持实时预 ...
- Aerospike系列:7:数据分布详解
1:Aerospike数据库是Shared-Nothing架构,集群中的每个节点都是相同的,不会出现单点故障. Aerospike有智能分区算法,即把用户输入的key在内部根据RIPEMD-160算法 ...
- 包管理和环境管理软件Anaconda
可以用于配置linux下得虚拟环境,该软件可以针对不同服务配置不同的运行环境,方便包管理与环境管理