C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

static_cast

相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换

非const转const、void*转指针、int和char相互转换

用于基类和子类之间的指针和引用转换,非指针直接报错

向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知;

dynamic_cast

用于动态类型转换。只能用于含有虚函数的类,必须用在多态体系种,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

如果没有virtual方法进行下行转换(指针或引用)会直接报错

const_cast

常量指针被转化成非常量的指针,并且仍然指向原来的对象;

常量引用被转换成非常量的引用,并且仍然指向原来的对象;

const_cast一般用于修改底指针。如const char *p形式。

const int a=10;
int *p=const_cast<int*>(&a);	//p和a指向同一块内存地址
*p = 100;	//修改*p,但a=10,*p=100

reinterpret_cast

(重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常

错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

reinterpret_cast不能转换掉表达式的const

可以用在将void*转换为int类型

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}
posted @ 2019-08-30 12:55  WindSun  阅读(1437)  评论(0编辑  收藏  举报
博客已停更,文章已转移,点击访问