现在的位置: 首页 > 综合 > 正文

cast族转换符使用总结

2013年05月08日 ⁄ 综合 ⁄ 共 965字 ⁄ 字号 评论关闭

示例1:
class A {};
class B : public A {};
class C {};

A* pA = new A();
B* pB = static_cast<B*>(pA);
C* pC = static_cast<C*>(pA); // 不能通过编译,C和A没有关系
long lData = static_cast<long>(pA); // 不能通过编译,long是内置数据类型,不是类

解析:static_cast是运行在类层次上(只针对类),内置类型(int,float,long等)不能参与转换.参与转换的两个类T和U,只要T->U能够隐式完成,static_cast就能够做U->T,T和U可以只声明而不定义,可以将它看成是隐含转换的显式逆运算.static_cast转换是不安全的.

示例2:
class A { virtual void Fun1() {}; };
class B : public A {};
class C : public B {};
class D : public C {};

C* pC = new C;
A* pA = dynamic_cast<A*>(pC); // pA == pC,不为NULL
B* pB = dynamic_cast<B*>(pA); // pB == pA,不为NULL
pC = dynamic_cast<C*>(pB);  // pC == pB,不为NULL
D* pD = dynamic_cast<D*>(pC); // pD == NULL

解析:dynamic_cast是运行在类层次上,内置类型(int,float,long等)不能参与转换.参与转换的类必须被定义.dynamic_cast基于RTTI(运行时类型识别),转化是安全的.

其它:
reinterpret_cast:reinterpret_cast运算符允许任意两种指针类型之间的互相转化,也允许任一整数类型和任一指针类型之间的转换,从本质上来说,这些转换都是不安全的,所以尽量少用reinterpret_cast转换符.

const_cast:通过转换获得对描述为const或volatitle的数据的访问权;或者说经过转换之后,去除数据的const或volatitle属性.
示例:
void Fun1(char* pData){}
void Fun2(const chat* pData)
{
 Fun1(const_cast<char*>(pData));

抱歉!评论已关闭.