c++中的四个转换运算符(,static_cast,const_cast,dynamic_cast,reinterpret_cast)
来源:互联网 发布:西门子选型软件 编辑:程序博客网 时间:2024/05/18 01:17
在C中几乎可以将任何类型强制转化成另外一种类型。这点是C的特点,也是C中容易出错的地方,让程序员对转化结果负责。C++除了兼容C强制转换操作符号外还增加了4个类型转化操作符号分别是static_cast、const_cast、dynamic_cast、reinterpret_cast。
static_cast使用在大多数数据类型转换地方,比如将Unsigned int转化int,一般用于数据类型转化。
const_cast用于将const类型转化为非const类型。这点属于容易出错的地方,在C中也可以使用强制转换操作符完成这个过程。但const_cast是关键字,在任何编辑器中都很容易找到使用的地方。一旦遇到因为const转换到非const的问题,立即就能够找到转化的地方进行检查调试。而使用C风格的转换符号则比较加难找。一没语法高亮,二没固定字符串可以搜索,三C风格的转换操作符样子都一样不容易区分。容易在出问题的时候快速找到这一个理由足够说服使用const_cast
dynamic_cast该操作符号用于把基类指针或引用转换成派生类的指针或引用。如果在需要用到dynamic_cast的地方使用C风格的转换操作符那就是大错特错了。看以下代码
class A{public:virtual ~A() {}};class B{public:virtual ~B() {}};class C:public A,public B{};class D:public B{};int main( int argc, char* argv[] ){C* p = new C;A* pA = p;B* pB = p;printf( "%p/t%p/t%p/n" , p , pA , pB );printf( "%p/t%p/t%p/n" , p , ( C* )pA , ( C* )pB );printf( "%p/t%p/t%p/n" , ( D* )p , ( D* )pA , ( D* )pB );//注意这一行printf( "%p/t%p/t%p/n" , dynamic_cast<D*>( p ) ,dynamic_cast<D*>( pA ) , dynamic_cast<D*>( pB ) );delete p;return 0;}
在我机器上输出如下
00394FD8 00394FD8 00394FDC
00394FD8 00394FD8 00394FD8
00394FD8 00394FD8 00394FDC
00000000 00000000 00000000
在将指针p转化成D*类型的时候使用了2中方法,结果却完全不同。很明显p不是D类型的,转化成D类型应该失败,而C风格却成功了。可以想像这样的代码会带来怎样的隐患
在这里dynamic_cast给出了正确的结果,正是我们所期望的结果。
reinterpret_cast是C类型转化的替代品,功能和C的强制转换操作符号一模一样。即使功能相同,但也应该优先使用reinterpret_cast。因为在编辑器中reinterpret_cast关键字非常醒目,能够时时提醒这是一个需要程序员承担后果的转换。
在C中有一个为了兼容旧代码的规定,那就是char* p=”aa”的合法。在这里将一个const char*类型转化成了char*,本来不合法的事情在这里变成了合法。于是很容易就有人写出类似的代码
int main(){char* p="aaa" ;strcpy( p , "bb" );return 0;}绝大多数编译器编译这个代码都不会有警告,但运行的时候基本上都会给一个系统异常正确的写法应该是:
int main(){const char* p="aaa" ;strcpy( p , "bb" );//编译错误return 0;}转帖:http://akirya.spaces.live.com/blog/cns!186DFCC1A15E4AC5!315.entry
- c++中的四个转换运算符(,static_cast,const_cast,dynamic_cast,reinterpret_cast)
- c++中四个类型转换符:static_cast,const_cast,dynamic_cast,reinterpret_cast
- C++的四个类型转换符dynamic_cast/const_cast/static_cast/reinterpret_cast
- c++ 强制转换类型运算符 const_cast reinterpret_cast static_cast dynamic_cast
- 运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
- C++类型转换运算符: static_cast<>,reinterpret_cast<>,dynamic_cast<>, const_cast<>
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
- C++ const_cast static_cast dynamic_cast reinterpret_cast运算符
- C++ const_cast static_cast dynamic_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++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)
- c++中的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
- c++中的类型转换(dynamic_cast, reinterpret_cast, static_cast ,const_cast)
- C++中的强制类型转换 static_cast reinterpret_cast dynamic_cast const_cast
- C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast
- C++中的类型转换之 const_cast static_cast dynamic_cast reinterpret_cast
- 迷茫
- Java类集应用
- virtools 学习笔记一:virtools 背景
- 接口与类集综合应用
- cmd命令集锦
- c++中的四个转换运算符(,static_cast,const_cast,dynamic_cast,reinterpret_cast)
- 入住csdn...
- 关于GDI绘图的新手说明
- 发展前景
- import static和import的区别
- php应用
- Linux内核配置文档
- 还原数据库.bak文件
- c