4.8 C++ typeid操作符
参考:http://www.weixueyuan.net/view/6378.html
总结:
typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。
如果需要使用typeid操作符,最好加上typeinfo头文件。
操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。
typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符,最好加上typeinfo头文件。
给出以下定义
int a;
double b;
char * c;
long d;
下表列出了使用typeid操作符的表达式的值:
表达式 | 值 |
---|---|
typeid(a) == typeid(int) | true |
typeid(a) == typeid(float) | false |
typeid(a) == typeid(int *) | false |
typeid(b) == typeid(double) | true |
typeid(b) == typeid(float) | false |
typeid(b) == typeid(long double) | false |
typeid(c) == typeid(char *) | true |
typeid(c) == typeid(char) | false |
typeid(c) == typeid(string) | false |
typeid(d) == typeid(long) | true |
typeid(d) == typeid(int) | false |
操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。
例1:
class base
{
public :
virtual void m(){cout<<"base"<<endl;}
}; class derived : public base
{
public:
void m(){cout<<"derived"<<endl;}
};
假设我们如本例所示定义了两个类base类和derived类,基于这两个类定义,我们定义指针如下:
base * p = new derived;
下表将给出使用typeid操作符的结果。
表达式 | 值 |
---|---|
typeid(p) == typeid(base*) | true |
typeid(p) == typeid(derived*) | false |
typeid(*p) == typeid(base) | false |
typeid(*p) == typeid(derived) | true |
对于表达式typeid(p),因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),因为base类具有多态性,因而在计算typeid(*p)时会根据运行时p所指向的实际类型去计算,而本例中p指向的是派生类对象,因此表达式typeid(*p) == typeid(derived)为真,typeid(*p) == typeid(base)为假。
例2:
class base
{
public :
void m(){cout<<"base"<<endl;}
}; class derived : public base
{
public:
void m(){cout<<"derived"<<endl;}
};
假设我们根据例2中定义的两个类来定义如下指针:
base * p = new derived;
下表将给出使用typeid操作符的结果。
表达式 | 值 |
---|---|
typeid(p) == typeid(base*) | true |
typeid(p) == typeid(derived*) | false |
typeid(*p) == typeid(base) | true |
typeid(*p) == typeid(derived) | false |
对于表达式typeid(p),同样,因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),由于此时的基类不具有多态性,因而*p将会采用编译期类型来计算,编译期*p是base对象,因此表达式typeid(*p) == typeid(derived)为假,typeid(*p) == typeid(base)为真。
4.8 C++ typeid操作符的更多相关文章
- typeid操作符
typeid() operator返回type_info,返回值不可拷贝.不可赋值 // Illustrates the typeid operator. #include <iostream& ...
- typeid详解(转)
(http://www.cppblog.com/smagle/archive/2010/05/14/115286.html) 在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time ...
- c++ typeid获取类型名-rtti
typeid操作符的作用就是获取一个表达式的类型.返回结果是const type_info&.不同编译器实现的type_info class各不相同.但c++标准保证它会实现一个name()方 ...
- typeid详解
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“ ...
- 使用typeid(变量或类型).name()来获取常量或变量的类型---gyy整理
使用typeid(变量或类型).name()来获取常量或变量的类型 <typeinfo> 该头文件包含运行时类型识别(在执行时确定数据类型)的类 typeid的使用 typeid操作 ...
- C++ typeid实现原理
最近看了boost::any类源码,其实现主要依赖typeid操作符.很好奇这样实现的时间和空间开销有多大,决定探一下究竟. VS2008附带的type_info类只有头文件,没有源文件,声明如下: ...
- 如何在C++中获得完整的类型名称(RTTI的typeid在不同平台下有不同的输出值表达,自建类改进了RTTI丢失的信息)
Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符可以用 ...
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
- c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
随机推荐
- legend2---开发日志4(常用的链接传值方式有哪些)
legend2---开发日志4(常用的链接传值方式有哪些) 一.总结 一句话总结:常用的其实就是get和post,不过有具体细分 a标签 post表单 js方式拼接url 1.js正则尽量少匹配的符号 ...
- hdu-6035 Colorful Tree
题目意思是计算所有路径(n*(n-1)/2)经过的不同颜色的数目和. 这个数目和可以转化为每种颜色经过的路径数目的求和,而这个求和又等价于颜色总数*n*(n-1)/2-没有经过某种颜色的边的数量的求和 ...
- Flex scroller皮肤的使用
Flex4 scroller 自定义皮肤 十月 15, 2010 Posted by admin flex4里引入了sparkSkin, spark包里的可视控件可以通过指定skinClass的值来修 ...
- centos6 安装python3.5后pip无法使用的处理
现象:安装pip后发现命令无法识别command not found 原因:which查看找到不到执行路径 find搜索发现安装后存放在/usr/local/python3.5/bin下,于是判断 ...
- PHP const关键字
常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后 ...
- UVALive - 7041 G - The Problem to Slow Down You
题意:求两个串的公共回文子串个数 题解:建两个回文自动机,从0和1各跑一边就是答案了,因为对于回文自动机来说,从头开始dfs就能找出该字符串的所有回文串 //#pragma GCC optimize( ...
- windows远程以及文件共享方法总结
文件共享部分 紧接着下一步[允许使用空密码] 参考这个链接 https://jingyan.baidu.com/article/7f766dafa8c5ee4100e1d071.html 在我们使用w ...
- vue嵌套路由--params传递参数
在嵌套路由中,父路由向子路由传值除了query外,还有params,params传值有两种情况,一种是值在url中显示,另一种是值不显示在url中. 1.显示在url中index.html <d ...
- org.springframework.web.bind.annotation重定向的问题
@RequestMapping(value="/redir/authcode") public ModelAndView getAuthCode(){ String authUrl ...
- Leetcode 860. 柠檬水找零
860. 柠檬水找零 显示英文描述 我的提交返回竞赛 用户通过次数187 用户尝试次数211 通过次数195 提交次数437 题目难度Easy 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...