您的位置:首页 > 编程语言

编写高质量代码——reintepret_cast、static_cast、dynamic_cast、const_cast

2014-05-31 13:53 417 查看
一、动态对象指针转换(static_cast和dynamic_cast比较)

1、static_cast动态对象指针转换特点:在用于类层次结构中基类和子类之间指针(或引用)的转换时:进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所有是不安全的(子类的指针对基类的操作,会无中生有地创造出子类所特有的那部分信息)。


2、在进行动态对象指针转换时,应该用dynamic_cast代替static_cast:在类层次间进行上行转换时,dynamic_cast 和static_cast 效果一样;在下行转换时,dynamic_cast具有类型检查功能,比static_cast更安全,将返回空指针。

3、dynamic_cast 比 static_cast 的效率更低。

===================================================================

二、reinterpret_cast(重新解释比特位和函数指针间转换)

1、基本功能:reinterpret_cast,保持二进制位不变,用另一种格式重新解释,可以实现一个类型到一个毫不相关、完全不同类型的映射。仅仅重新解释了给出对象的比特模型。

2、使用的前提条件:对对象的内存分布十分清楚。

3、最普通的用途是函数指针类型之间进行转换。



例如,假设有一个函数指针数组:

//FuncPtr:函数指针

typedef void(*FuncPtr)();

//funcPtrArray :函数指针数组

FuncPtr funcPtrArray [10];

在funcPtrArray 中不能直接存入如下函数的指针,因为返回值的类型不一致:

int doSomething();

funcAPtrArray[0] = &doSomething;//ERROR!类型不匹配

--------------------------------------------

funcPtrArray[0] = < reinterpret_cast >(&doSomething);//告诉编译器以返回void的形式去看待函数doSomething。

===================================================================

三、reinterpret_cast和static_cast 比较



一般的类型转换编译器会根据类型信息进行一些分析、处理,例如:

int i=2011;

double d=static_cast< double >(i);

变量从 int 转换到 double 的过程中,static_cast先将整数 2011 转换为双精度整数 2011,再为双精度整数 d 补足比特位,得到结果 2011.0。

reinterpret_cast 仅仅是复制 i 的比特位到 d,缺乏必要的分析,严重违背了C++的类型安全性原则。



---------------------------------------------------------------------

尽量避免使用 reinerept_cast ,除非在其他转换都无效的情况下。

=====================================================================



四、const_cast< T* >(a)

一般用于从一个类中去除以下属性:const、volatile、_unaligned。

使用弊端,例如:

对于本身定义为 const 的类型,应用const_cast去掉了 const 属性,然后再对这块内容进行 write 操作时,程序罢工:

const char* pStr="Hello,2012";

char* sz=const_cast<char*>(pStr);

sz[0] = 'A';

原因:一般编译器在处理常量数据时,会将其存放在只读存储器(ROM)中或具有写保护的随机访问存储器(RAM)中。如果试图对这种物理上的 const 对象进行 write 操作,其表现多为内存故障。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐