编写高质量代码——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 操作,其表现多为内存故障。
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 操作,其表现多为内存故障。
相关文章推荐
- static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。(转)
- 强制类型转换 static_cast、dynamic_cast、reinterpret_cast、和const_cast
- 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)
- 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)
- C++基础重温之二:static_cast, dynamic_cast, const_cast, reinterpret_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(转)
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- static_cast、dynamic_cast、reinterpret_cast和const_c
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)
- 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。(转)
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- 【转】使用标准C++的类型转换符:static_cast、dynamic_cast、const_cast和reinterpret_cast
- static_cast、dynamic_cast、reinterpret_cast、和const_cast(2)
- static_cast、dynamic_cast、reinterpret_cast、和const_cast