当前位置: 首页 > news >正文

网站都有什么类型秦皇岛最新通知

网站都有什么类型,秦皇岛最新通知,深圳企业网站备案,凡科互动app下载From: http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx 在揭开typeid神秘面纱之前#xff0c;我们先来了解一下 RTTI #xff08;Run-Time Type Identification#xff0c;运行时类型识别#xff09;#xff0c;它使程序能够获取由基指针或引用所指向的对…From: http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx 在揭开typeid神秘面纱之前我们先来了解一下 RTTI Run-Time Type Identification运行时类型识别它使程序能够获取由基指针或引用所指向的对象的实际派生类型即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C中为了支持RTTI提供了两个操作符dynamic_cast和typeid。dynamic_cast允许运行时刻进行类型转换从而使程序能够在一个类层次结构中安全地转化类型与之相对应的还有一个非安全的转换操作符static_cast因为这不是本文的讨论重点所以这里不再详述感兴趣的可以自行查阅资料。下面就开始今天我们的话题typeid。typeid 是C的关键字之一等同于sizeof这类的操作符。typeid操作符的返回结果是名为 type_info 的标准库类型的对象的引用在头文件typeinfo中定义稍后我们看一下vs和gcc库里面的源码它的表达式有下图两种形式。如果表达式的类型是类类型且至少包含有一个虚函数则typeid操作符返回表达式的动态类型需要在运行时计算否则typeid操作符返回表达式的静态类型在编译时就可以计算。ISO C标准并没有确切定义type_info它的确切定义编译器相关的但是标准却规定了其实现必需提供如下四种操作在之后的章节中我会来分析type_info类文件的源码 t1 t2 如果两个对象t1和t2类型相同则返回true否则返回false t1 ! t2 如果两个对象t1和t2类型不同则返回true否则返回false t.name() 返回类型的C-style字符串类型名字用系统相关的方法产生 t1.before(t2) 返回指出t1是否出现在t2之前的bool值 type_info类提供了public虚 析构函数以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符由此可见如果把typeid看作函数的话其应该是type_info的 友元。type_info的name成员函数返回C-style的字符串用来表示相应的类型名但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致往往如此见后面的程序这 具体由编译器的实现所决定 的标准只要求实现为每个类型返回唯一的字符串。上面的都是一些理论的东西看不真切下面将通过代码和图例来展示。#include iostream using namespace std; class Base {}; class Derived: public Base {}; int main() {     Base b, *pb;     pb NULL;     Derived d;     cout  typeid(int).name()  endl           typeid(unsigned).name()  endl           typeid(long).name()  endl           typeid(unsigned long).name()  endl           typeid(char).name()  endl           typeid(unsigned char).name()  endl           typeid(float).name()  endl           typeid(double).name()  endl           typeid(string).name()  endl           typeid(Base).name()  endl           typeid(b).name()endl          typeid(pb).name()endl          typeid(Derived).name() endl          typeid(d).name()endl           typeid(type_info).name()  endl;               return 0; }我分别用MS的V8和GUN的GCC编译该段代码并运行结果分别为下面的左右二图。对比代码以及上面的文字描述不知道各位是否已经有所明了这里需要注意的是Base类的对象b和对象指针pb他们的输出。考虑到V8的输出很直观所以我采用V8来做实验。下面对上面的代码稍微添加一点内容如下Base *pb2  dynamic_castBase *(new Derived); Base b2 d; Base *pb3 d; cout  typeid(pb2).name() endl//输出Base *      typeid(b2).name()endl //输出Base      typeid(pb3).name()endl//输出Base *      typeid(*pb3).name()endl;//输出Base 因为Base不包含虚函数所以typeid的结果指出表达式的类型是Base或Base *型尽管他们的底层对象是Derived。即 当typeid操作符的操作数是不带有虚函数的类类型时typeid操作符会指出操作数的类型而不是底层对象的类型。下面在对Base函数做一个小小调整为其加上一个虚函数再看输出结果。class Base {virtual void f(){}; }; /*...*/ cout  typeid(pb2).name() endl//输出Base *      typeid(b2).name()endl //输出Derived      typeid(pb3).name()endl//输出Base *      typeid(*pb3).name()endl;//输出Derived这次Base含有虚函数注意看结果指针仍然是Base*的尽管他们指向的是底层对象Derived而这些Base对象的类型却是Derived的。因为指针pb3不是类类型所以typeid就返回该指针pb3的指针类型Base *。而*pb3是一个类类型的表达式而且该类带有虚函数所以指出该pb3指向的底层对象的类型Derived。如果typeid操作符的操作数是至少包含一个虚拟函数的类类型时并且该表达式是一个基类的引用则typeid操作符指出底层对象的派生类类型。好了文篇到此结束留下几道小题目吧。//采用V8环境 cout typeid(7.84) endl      typeid(Base*) endl      typeid(pb3) endl;感谢  http://blog.programfan.com/article.asp?id45931
http://www.yutouwan.com/news/450652/

相关文章:

  • 下载网站专用空间重庆新闻第一眼
  • 做网站的方法及措施简单描述什么是网络营销
  • 网站未在腾讯云备案如何用爬虫做网站监控
  • 青岛 制作网站 大点的公司wordpress文章获取接口
  • 网站设计素养杭州公司网站域名续费
  • 手机网站怎么做才适合优化建立一个自己的网页
  • 做网站为什么要做备案接入做一个网站需要多少钱大概
  • 如何建设网站使用seo
  • 做网站多少钱鞍山市残疾人网站开发
  • 贵州建设厅网站政务大厅线上营销方式
  • 灯塔建设网站天津做系统集成的公司网站
  • 如何做机票预订网站京东云服务器怎么做网站
  • 网站建设外出考察信息手机网站管理系统
  • 网站模板及源码坂田公司做网站
  • 陕西西安网站建设公司排名网站内部搜索怎么做
  • 新乡公司做网站找哪家公司好查网站排名
  • 做网站的销售怎么样网站核检单
  • 可信赖的丹阳网站建设在线商标免费设计
  • 网站被降权会发生什么影响吗免费的行情网站
  • 电商网站构建html个人主页源代码
  • 怎么自己创立网站行政部建设公司网站
  • 做黎川旅游网站的目的山东建筑公司实力排名
  • 秦皇岛网络公司 网站托管平面设计软件名称
  • 上传空间网站智慧团建电脑版注册登录入口
  • 中天钢铁 网站建设如何做seo
  • 网站建设需要什么设备中国机械加工网订单
  • 建社个人网站清远市住房与城乡建设局的网站查
  • wordpress建手机网站中企动力app
  • 太原优化型网站建设wordpress滑动验证2016
  • 网站开发流程甘特图房产公司网站建设