您的位置:首页 > 编程语言 > C语言/C++

static-cast dynamic_cast const_cast reinterpret_cast

2016-08-26 22:56 204 查看
static_cast: 一般的转换(no run-time check)通常,如果你不知道该用哪个,就用这个。

dynamic_cast: 通常在基类和派生类之间转换时使用

const_cast: 主要针对const和volatile的转换

reinterpret_cast: 用于进行没有任何关联之间的转换。

const_cast主要是使用在const型数据与volatile型数据之间的转换,比如进行函数传递时,如果函数原型是一个const
int*的数据,那么此时在函数内部使用该数值是不能进行修改的,举个例子,有些库函数如strcpy之类的是const型数据,不能改变dst的数据,那么需要改变的其中的值得时候那么使用const_cast就可以进行数据值的修改。

reinterpret_cast使用限制比较少,只要是转换的两者的内存空间不会溢出就可以转化,举个例子,如果32位下int
为4bytes,那么可以reinterpret_cast转换为两个short型结构体,但是不能转换为4个short结构体,因为草除范围了。

static_cast与dynamic_cast有相似之处,此处一并讨论,static_cast是在编译期间进行转换,dynamic_cast是在运行期间进行转换。前者在子类对象转换为基类对象是可以的是安全的,但是基类对象转换指向子类的内存空间就需要程序员考虑安全性的,如果子类对象不是指针对象,那么在向下转换(即基类转向子类时)会出现编译错误,即编译不能通过,如果是指针对象那么是可以编译通过的,但是如果在运行阶段调用了不能调用的函数就会抛出异常,这就需要程序员进行检查了,但是对于无论是基类还是子类,转换之后其可以调用的函数依旧是类中定义的函数,即基类即使进行转换指向子类的内存空间成功,其依旧只能使用自己类中定义好的接口函数。

对于dynamic_cast,只有上行转化才是有意义的,即子类指针转向基类内存空间时才是有效的,但是下行转换并不是每一次都是有效的,只有当基类对象本身是指向派生类内存空间时才有效,举个例子:CBase是基类,CDerive是派生类,那么

CBase
*pb=new CBase;//pb是CBase对象,指向CBase内存空间

CBase
*pb2=new CDerive;//pb2是CBase对象,指向的却是CDerive内存空间

CDerive
*pt = dynamic_cast<CDerive*>(pb);//Error,pt==NULL,因为pb指向的是CBase内存空间,不能进行下行转换为CDerive内存空间

CDerive
*pt2=dynamic_cast<CDerive*>(pb2);//OK.因为pt2本身就是指向CDerive内存空间,因此转化为同类的pt2是正确的。

以上语句3中的CDerive
*pt = dynamic_cast<CDerive*>(pb);编译是可以通过的,只是调用pt的成员函数时由于pt转化,因此pt==NULL导致不能调用其成员函数(毕竟指向的是NULL,哪来的成员函数)。

这就是static_cast与dynamic_cast的区别,哦,注意dynamic_cast必须是需要有至少一个虚函数,这样才有虚函数表,因为dynamic_cast是在运行时进行判断是否可以进行转换,如果没有虚函数表那么基类对象转化为子类的内存空间就没有意义了,毕竟即使转化了,调用的成员函数依旧是自己的,因为没有虚函数吗,所以需要有至少一个虚函数,这样才会有虚函数表。

参考资料:http://www.cnblogs.com/zhyg6516/archive/2011/03/07/1971898.html

写的挺好的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++