• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 对这几个reinterpret_cast,static_cast,dynamic_cast不太明白,哪位解释一下啊,分全送……

对这几个reinterpret_cast,static_cast,dynamic_cast不太明白,哪位解释一下啊,分全送……

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 对这几个reinterpret_cast,static_cast,dynamic_cast不太明白,哪位解释一下啊,分全送……等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 对这几个reinterpret_cast,static_cast,dynamic_cast不太明白,哪位解释一下啊,分全送……
描述:

如在IUnknown::QueryInterface()中
if(iid == IID_IUnknown)
{
    *ppi = static_cast<IX *>(this);
}
而在后面
reinterpret_cast<IUnknown *>(*ppi)->AddRef();
另外也请稍带比较dynamic_cast


解决方案1:

static_cast
用于数字之间的转换,如int a = static_cast< int >( 0.5f );等
用于类层次之间的转换,即只能用于从父类指针向子类指针转换,不可不在同一继承层次中的类的指针之间互相转换。
static_cast是静态转换,编译时刻进行转换,并进行正确的对象布局(比如虚函数表的位置)。比如CC派生自CA和CB,而如下:
CC c;  CA *pA = static_cast< CA* >( &c );则正确,而
CA *pA = reinterpret_cast< CA* >( &c );不一定正确,要视CC定义时,CA和CB之间的顺序。
假定c对象中,开头8个字节是CB的部分,接着8个字节是CA的部分,最后8个字节是CC自己增加的部分,而用static_cast就会将&c返回的4个字节长度的数加个8,即正确的类型转换(编译时刻完成),但是reinterpret_cast就不会加8。
reinterpret_cast是强制转换,即将被转换的对象看作一个数字(小于等于4字节),不论其是否指针,即可如下:
CC *pC = reinterpret_cast< CC* >( 1.0f );
不会象static_cast那样检测类型,判断两边是否属于同一个继承层次,并进行相应的指针偏移(如上就必须偏移8字节)。
dynamic_cast和static_cast相同,会进行指针的偏移,不过是运行时进行转换,就可检测被转换对象到底是否在同一个继承层次,不是象static_cast那样通过程序员的声明来确定,而是通过被转换对象所带有的运行时期类信息(RTTI)确定,如果不是,将返回null以指出失败。
由于需要RTTI的支持,因此每个对象将会比原来的尺寸多出4个字节用来存放RTTI,将会增加内存的损耗;并且要进行条件判断,速度将会更慢。要支持RTTI,需要开启相应的编译器选项。
一般应不使用dynamic_cast,且不开启RTTI,除非程序必需要用到RTTI进行运行时期信息识别,但这种情况一般都可使用其他方式实现,避开RTTI的使用。
const_cast完全是出于语意的需求,只是简单的将const的变量转成非const或反之,由于是针对语意的,说起来比较麻烦,在此不表。
应该全部使用上诉4个C++提供的转换符,而不要使用C语言风格转换符(对于函数指针则只有用C语言转换符)。使用C语言风格转换符将会统一使用static_cast,即自动的进行指针的偏移,如果不希望进行偏移,还得( ( CA* ) ( (int*) &c ) )。并且编译时,新的转换符意义明确,可以加快编译器的编译(不用去判断是否在同一个继承层次,虽然加快的速度人是不可能感觉得出来的),而且使用新的转换符,程序的可读性增加,并且const_cast的加入更增加了语意的完善。

解决方案2:

reinterpret_cast允许任何类型的指针转换到别的任何类型的指针,不太安全一切都要自己小心使用。
#include <iostream>
unsigned short Hash( void *p )
// Returns a hash code based on an address
{
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}
using namespace std;
int main()
{
   int a[20];
   for ( int i = 0; i < 20; i++ )
      cout << Hash( a + i ) << endl;
}
static_cast是静态的,没有运行时的类型检查,而dynamic_cast有运行时的类型检查,static_cast不安全,一般少用,用的时候自己必须想清楚是否安全!这两个主要是对对象指针和引用的转换
class B { ... };
class D : public B { ... };
void f(B* pb, D* pd)
{
    D* pd2 = static_cast<D*>(pb);        // not safe, pb may
                                         // point to just B
    B* pb2 = static_cast<B*>(pd);        // safe conversion
    ...
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 对这几个reinterpret_cast,static_cast,dynamic_cast不太明白,哪位解释一下啊,分全送……

相关文章

  • 2017-06-05 如何把GetProcAddress得到的地址赋值给数组?
  • 2017-06-04 使用mscomm进行串口通信的问题
  • 2017-06-05 在98下怎样屏蔽系统功能键?
  • 2017-06-05 请教,如何在DLL中使用ACTIVEX控件?(十万火急!!!)
  • 2017-06-04 请教COM,DCOM,DLL的区别
  • 2017-06-05 帮我看看我个DLL为什么调用有问题?
  • 2017-06-04 客户端调用服务端的接口方法时服务器退出,为什么客户端也会退出
  • 2017-06-05 一匹"黑马",想升星的来!,不要怕分不够!
  • 2017-06-05 线程结束后,这个线程的所有资源被释放,那是不是就可以不必关已经打开的文件了
  • 2017-06-04 还是要问一下ATL制作控件方面的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 在服务中,监听socket端口的问题?高手请进
    • IE工具条自定义按钮调用ActiveX
    • VC60注册的Web控件,能否支持IE7?
    • dll连入exe的疑惑?
    • 用regsvr32注册一个基于ATL/COM的desktopband后,只能在任务栏右键单击的菜单里把它移除吗?
    • 如何运行时使用函数索引号调用动态库的函数(急)
    • 使用ShellExecute时怎么得到子进程的句柄和ID呢??
    • 如何在程序中改变系统外观设置并立即刷新
    • 接口和它的CoClass之间是否可以相互转换
    • IE中actievx可视窗口大小怎么控制?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有