这篇文章将为大家详细讲解有关typeid关键字如何在c++中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> typeid关键字强>
注意:类型id是操作符,不是函数。这点与运算符类似)
运行时获知变量类型名称,可以使用类型id(变量). name ()
需要注意不是所有编译器都输出“int”、“浮动”等之类的名称,对于这类的编译器可以这样使用
int ia=3; 如果(类型id (ia)==类型id (int)) { cout & lt; & lt;“int"& lt; & lt; endl; }
<>强RTTI(运行时类型识别)——运行时类型识别强>
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(运行时类型识别、运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许”用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。
在c++中,为了支持RTTI提供了两个操作符:dynamic_cast和类型id
- <李> dynamic_cast允许运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转化类型,与之相对应的还有一个非安全的转换操作符static_cast,因为这不是本文的讨论重点,所以这里不再详述,感兴趣的可以自行查阅资料。李> <李>类型id是c++的关键字之一,等同于sizeof这类的操作符.typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义,稍后我们看一下vs和gcc库里面的源码),它的表达式有下图两种形式。李>
<强>实现机制与使用技巧
强>
type_info类对象类别判别<强>
强>
对象类别判别分析
如果表达式的类型是类类型且至少包含有一个虚函数,则类型id操作符返回表达式的动态类型,需要在运行时计算,
否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。
ISO c++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作(在之后的章节中我会来分析type_info类文件的源码)
运算描述t1==t2如果两个对象t1和t2类型相同,则返回真的,否则返回falset1 !=t2如果两个对象t1和t2类型不同,则返回真的,否则返回falset.name()返回类型的C风格的字符串,类型名字用系统相关的方法产生1 t1.before (t2)返回指出t1是否出现在t2之前的bool值type_info类提供了公共虚析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为私有的,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的友元).type_info的名字成员函数返回C风格的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致(往往如此,见后面的程序),这具体由编译器的实现所决定的,标准只要求实现为每个类型返回唯一的字符串。
<强> type_info类源代码强>
使用sudo/- name typeinfo找到。h来查找源码
的ifndef _TYPEINFO #定义_TYPEINFO # include & lt; exception> 名称空间性病 { 类type_info { 公众: 虚拟~ type_info (); {返回__name [0]==& # 39; * & # 39;,# 63;__name + 1: __name;} bool之前(const type_info&__arg)常量 {返回__name & lt;__arg.__name;} bool操作符==(const type_info&__arg)常量 {返回__name==__arg.__name;} bool运营商!=(const type_info&__arg)常量 {回报!操作符==(__arg);} 虚拟bool __is_pointer_p()常量; 虚拟bool __is_function_p()常量; 保护: const char * __name; 明确type_info (const char * __n): __name (__n) {} 私人: type_info&运算符=(const type_info&); type_info (const type_info&); }; }//外面的“c++”; # endif
<>强示例1 -基本数据类型强>
下表列出了使用typeid操作符的表达式的值
typeid关键字如何在c++中使用