转: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 = &num;
int *pNum = cpNum;            //error:cannot convert from 'const int *' to 'int *'
int *pNum = (int *)cpNum;                 //旧式C
int *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++转型操作符的更多相关文章

  1. 【M2】最好使用C++转型操作符

    1.C语言中的转型操作符有两个问题: a.是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型.通用必定是低效率和冗余的,因为要考虑很多情况. b.在代码中,难以辨认出哪些是类型转换. 2.C ...

  2. C++中的四种转型操作符

    在具体介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点: ①它差点儿同意将不论什么类型转换为不论什么其它类型,这是十分拙劣的.假设每次转型都可以更精确地指明意图,则更好. ②旧式转型难以辨 ...

  3. 5.9 C++重载转型操作符

    参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...

  4. 新式转型操作符[条款9] --《C++必知必会》

    在旧式转型(cast)下面隐藏着一些见不得人的.鬼鬼祟祟的东西.他们的语法形式使其在一段代码中通常很难引起人们的注意,但它们可能会搞一些可怕的破坏活动,就好比你冷不丁被一个恶棍猛击一拳似的.让我们阐明 ...

  5. 【More Effective C++ 条款2】最好使用C++转型操作符

    C的转型方式存在以下两个缺点: 1)几乎允许你将任何类型转化为任何类型,不能精确的指明转型意图,这样很不安全 如将一个pointer-to-base-class-object转型为一个pointer- ...

  6. C++ 之 新式转型操作符

    四种新式转型: const_cast.dynamic_cast.reinterpret_cast.static_cast!! 1.const_cast  :  去除常量性 2.dynamic_cast ...

  7. 条款二:最好使用c++转型操作符

    一.static_cast基本上拥有与c旧式转型相同的威力与意义,以及相同的限制,不能够移除表达式的常量性,const_cast负责这个功能 二.const_cast用来改变表达式中的常量性,如果将c ...

  8. CLR via C#(08)-操作符

    对于操作符,我们并不陌生,例如+,-,*,%等二元操作符,以及++,!等一元操作符.但是对于非基元类型,我们需要通过一些自定义方法才能使用这些操作符.今天主要和大家分享关于操作符重载和转换操作符的知识 ...

  9. C# 数据类型转换 显式转型、隐式转型、强制转型

    C# 的类型转换有 显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问 ...

随机推荐

  1. hdu Boring count(BestCode round #11)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. Windows系统Ionic安装教程/Ionic环境配置

    原文链接:http://blog.csdn.net/superjunjin/article/details/43412017 参考文章 Cordova 3.x 基础(1) -- 环境搭建(Window ...

  3. File /hbase could only be replicated to 0 nodes instead of minReplication (=1). There are 30 datanode(s) running and no node(s) are excluded in this operation.

    原因: hdfs-site.xml中的配置为: <property> <name>dfs.datanode.du.reserved</name> <value ...

  4. Python中字符串的Format用法。

    一.例子: "]) "_".join(map(lambda x:str(x),[1,2,3,4])) "{0}-{1}".format(3.4,34) ...

  5. MYSQL SELECT FOR UPDATE

    问题说明: 最近遇到一个问题,多个WORKER同时向MYSQL数据库请求任务,如何实现互斥?例如: SELECT * FROM student WHERE id > 10 LIMIT 100; ...

  6. JDK5.0 特性-线程任务执行架构 ScheduledExecutorService

    来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...

  7. npm 主要命令

    本文主要参考自:http://www.runoob.com/nodejs/nodejs-npm.html 1.使用 npm 命令安装模块 $ npm install express var expre ...

  8. Objecttive-C各种问题

    1.invalid argument type 'void' to unary expression @try{ if (![mJQFMDB open]) { NSLog(@"Could n ...

  9. 5、探秘JDK5新并发库之原子性操作类

    java.util.concurrent.atomic包里提供了 AtomicBoolean 可以用原子方式更新的 boolean 值. AtomicInteger 可以用原子方式更新的 int 值. ...

  10. SQL SERVER 2008 “阻止保存要求重新创建表的更改”

    在SQL SERVER2008中,新建数据表以后,若再对该表进行更改,则会出现警告信息“不允许保存更改 阻止保存要求重新创建表的更改”,等等,需要进行一下设置: 工具--->选项--->D ...