koobin

我的第一个C++技术Blog

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  2 随笔 :: 1 文章 :: 0 评论 :: 0 Trackbacks

旧的C风格转型几乎允许你把任何类型转换成任何其他类型(当然有些限制)

由于他的功能太强大,对于程序员阅读这样的程序会带来很大的识别障碍

几乎所有的工作都用(type)expression的方式进行转换

为此C++提供了4种新的转型操作符号(cast operation)
static_cast,const_cast,dynamic_cast和reinterpret_cast

1.static_cast
   static_cast基本拥有c风格转型差不多的功能,和相同的限制。比如int向double的转换
   int testNum;
   static_cast<double>testNum;
   同样你也不能将int或者struct转换成pointer,这个转换在c里面也是不允许的

   值得注意的是static_cast不支持const向non-const的互相转换,就是说不能排除表达式的常量性
   const_cast负责这一功能
2.const_cast
   const_cast专注于这一功能,应用面很狭窄,大使增加了可读性。
   class A{...}
   class AB:public A{...}
   void Update(AB* xy);

   AB ab;
   const AB& cab = ab;
   Update(&cab);//这样是错误的
   Update(const_cast<CAB*>(&cab));//正确,去掉了常量性

   但是 const_cast不支持带有继承关系的转换
   A* pa = new AB;
   Update(const_cast<AB*>pa);//这样是错误的
   现在我只需要记住。const_cast最重要的作用就是去除常量性
3.dynamic_cast
   用来执行继承体系中安全的向下转型或者跨系转换,上面的操作用dynamic_cast是可以支持的
   A* pa = new AB;
   Update(dynamic_cast<AB*>pa);
   注意的是关于此操作符的返回值
   如果表达式是pointer ,转换失败的话会得到一个NULL
   如果............是ref       ,........................会抛出一个异常
   dynamic_cast只能做这一类型的转换,请不要尝试去用dynamic_cast改变表达式的常量性,也无法在缺乏虚函数的型别上使用(比如int to double,这样的转换得使用static_cast)
4.reinterpret_cast
   这个我了看的不是很透,资料上说与编译环境相关,不具备移植性。
   他最常用途是转换(函数指针)的型别
   有一个保存函数指针的数组,里面指针指向函数的return 都是void
   但是你现在有个函数return为int,这个时候如果你想把这个函数放进funcPtrArray
   如果没有转型是可能实现的
typedefine void  (*FuncPtr())
   int func();
   funcPtrArray[0] = &func;//错误,型别不对
     funcPtrArray[0]  = reinterpret_cast(FuncPtr)(&func);//正确   

   
posted on 2007-01-31 14:01 koobin 阅读(250) 评论(0)  编辑 收藏 引用

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