C++中的四个xxx_cast

Posted on 2006-10-14 15:59 David Z 阅读(282) 评论(0)  编辑 收藏 引用

转载自: http://guoshan.blogchina.com/blog/4460907.html

关键词 强制类型转换                                          

*   C++ 提供了四种新的类型强制:

static_cast
const_cast
reinterpret_cast
dynamic_cast

1)staic_cast
静态强制;

不能在无关的指针之间进行 static 类型强制
class   CAnimal
{
//...
public:
CAnimal(){}
};

class   CGiraffe:public   CAnimal
{
//...
public:
CGiraffe(){}
};

int   main(void)
{
CAnimal   an;
CGiraffe   jean;

an   =   static_cast(jean);//
将对象 jean 强制成 CAnimal 类型
return   0;
}

2
const_cast 类型强制

const_cast
类型强制将一个 const 变量变成一个非 const 的等价形式
int   main()
{
const   int   j   =   99;
int   *   k;

k   =   const_cast(&j);//
解除 const
return   0;
}

3
reinterpret_cast 运算符


reinterpret_cast
运算符用来将一个类型指针转变为另一种类型的指针,也用在将整开型量转为指针,或将指针转为整型量上;
int   main()
{
int   j   =   10;
int   *   ptr   =   &j;
char   *   cptr;

cptr   =   reinterpret_cast(ptr);//
int 指针类型转变为 char 的指针类型

return   0;
}

4
dynamic_cast 运算符

dynamic_cast
的主要目的是:

1
)它返回派生类对象的地址;
2
)它测试基类指针是否指向下一尖括号 <> 中所指定类型的对象

dynamic_cast
是一个运行时类型信息, dynamic_cast 运算符将指向派生对象的基类部分的基类指针转变为指向派生对象的派生类指针, dynamic_cast 必须严格地指定与派生对象相同的类,或者它返回 NULL 指针 ;
class   CAnimal
{
//...
};
class   CGiraffe:public   CAnimal
{
//...
};
class   CGoat:public   CAnimal
{
//...
};

int   main()
{
CGiraffe   gene;
CAnimal   *   aptr   =   &gene;
CGiraffe   *   ptr1,*   ptr2;

ptr1   =   dynamic_cast(aptr);
ptr2   =   dynamic_cast(aptr); //return   NULL

return   0;
}

 

C++   里最好杜绝使用   C   方式的强制转换 ,   换用以上   4   .
我们通常用的是
  static_cast
在一类东西都可以转 ,   但是不是一类的就不能转
.
,   语义上说不通的 ,   两个完全不同的数据类型
  static_cast
是拒绝工作的
.    
比如你想把一个指针转成浮点数
,
或者想把   class   A   *   转成     class   B   *   ,   但是   class   A  
  class   B
又没有任何关系 .   等等
....

static_cast  
在通过编译后 ,   空间和时间效率实际等价于   C   方式强制转换
.
都是编译时决定的
.

dynamic_cast  
类似   static_cast,   但是在一颗类继承树上转换时
,
将利用   RTTI   在运行时检查 .   我们一般用于
  downcast

比如
,
class   A   {};
class   B   :   public   A   {};

A*   a=new   B();

这个时候 ,   可以用   dynamic_cast     downcast,     a   转成
  B*.
  static_cast   不同 ,   dynamic_cast   会检查一下   a   到底是不是指向一个

B,   (
利用了   RTTI)   如果转不了 ,   将返回一个   NULL.

reinterpret_cast  
就比   static_cast   更接近   C   的强制转换了
.
它更进一步的 ,   实现一些看起来没关系的两种类型转换
.
比如我习惯干的 ,   把一个   void   *     转成
  unsigned   ;)
当然它比   static_cast   危险
.

但是有   reinterpret_cast   干不了的
,
比如你在一个   const   成员函数里企图修改一个非   mutable   的成员变量
.
编译器会对你咆哮 ,   " 不许动 ,   那玩意是我   const   住的 ,   把你的爪子

收回去 "   这个时候就要利用   const_cast   ,   呵呵 .

const_cast  
就是可以解除   const   限制的 " " 的武器
 
但我认为 ,   这在很多情况下比   reinterpret_cast   更危险 ,   我还是老实做

人的好 .   让编译器来捍卫我的代码的安全 .


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


posts - 3, comments - 0, trackbacks - 0, articles - 0

Copyright © David Z