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个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
随机推荐
- jmap -histo pid 输出的[C [B [I [S 的含义
JMAP 输出 其中: [C is a char[][S is a short[][I is a int[][B is a byte[][[I is a int[][]
- English Voice of << Last Christmas >>
Last Christmas填 词:乔治·迈克尔谱 曲:乔治·迈克尔编 曲:乔治·迈克尔歌词:Last Christmas I gave you my heart去年的圣诞节,我把心给了你But th ...
- C#获取网页的HTML码、下载网站图片
1.根据URL请求获取页面HTML代码 /// <summary> /// 获取网页的HTML码 /// </summary> /// <param name=" ...
- 20171026python读取txt写入csv
import csv def get_lines(filepath): with open(filepath) as file_object: lines=set(file_object.readli ...
- php单例模式的使用场景,使用方法
一个类只有一个对象实例 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2 ...
- python记录_day25 包
1.包就是一个文件夹 当我们导入一个包的时候,默认执行这个包内的__init__.py文件 在python2中必须写__init__.py文件,python3中可以不写,但是最好也写上 代码的结构: ...
- 并查集 牛客练习赛41 C抓捕盗窃犯
题目链接 :https://ac.nowcoder.com/acm/contest/373/C 题意,初始每一个城市都有一伙盗贼,没过一个时刻盗贼就会逃窜到另一个城市,你可以在m个城市设置监察站,会逮 ...
- 数据库连接的WEB登录界面的实现
要实现此功能,需要电脑安装JAVA EE.SQL Server 2008和Tomcat等软件,并进行配置环境成功. 对这门课的希望和自己的目标: 希望:可以完全掌握老师所讲的内容. 目标:能够完整的做 ...
- tcpcopy真实流量压测工具
https://quentinxxz.iteye.com/blog/2249799 http://blog.chinaunix.net/uid-25057421-id-5576741.html htt ...
- const constptr 和引用的盲点(未解决)
#include<iostream> //const 和 引用的值必须初始化 //等号左侧是const或者const和引用,右侧可以是数字,普通变量-等号左侧是const和指针,右侧必须是 ...