typeid 运算符通常被用来判断两个类型是否相等。
typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要,它描述了数据的各种属性:
- 对于基本类型(int、float 等C++内置类型)的数据,类型信息所包含的内容比较简单,主要是指数据的类型。
- 对于类类型的数据(也就是对象),类型信息是指对象所属的类、所包含的成员、所在的继承关系等。
(1)内置类型的比较
#include<iostream>
#include<typeinfo>
using namespace std;
int main()
{
int a = 2; int b = 10;
float f;
char *str;
cout<<(typeid(int)==typeid(a))<<endl;//1
/*一个类型不管使用了多少次,编译器都只为它
创建一个对象,所有 typeid 都返回这个对象的引用。*/
cout<<(typeid(a)==typeid(b))<<endl;//1
cout<<(typeid(a)==typeid(f))<<endl;//0
cout<<(typeid(int)==typeid(char))<<endl;//0
cout<<(typeid(str)==typeid(char))<<endl;//0
cout<<(typeid(str)==typeid(char*))<<endl;//1
return 0;
}
(2)类的比较
#include<iostream>
#include<typeinfo>
using namespace std;
class Base{
};
class Derived:public Base{
};
int main()
{
Base obj1;
Base *p1;
Derived obj2;
Derived *p2=new Derived;
p1=p2;
cout<<(typeid(obj1)==typeid(*p1))<<endl;//1
cout<<(typeid(&obj1)==typeid(p1))<<endl;//1
cout<<(typeid(obj1)==typeid(obj2))<<endl;//0
cout<<(typeid(*p1)==typeid(Base))<<endl;//1
/*即使将派生类指针 p2 赋值给基类指针 p1,
p1 的类型仍然为 Base**/
cout<<(typeid(p1)==typeid(Base*))<<endl;//1
cout<<(typeid(Derived*)==typeid(p1))<<endl;//0
return 0;
}
#include<iostream>
#include<typeinfo>
using namespace std;
class B{
public:
virtual void vm(){
}
int b=10;
};
class D:public B{
};
int main()
{
B *pb=new D;
D *pd=(D*)pb;
cout<<(typeid(pd)==typeid(D*))<<endl;//1
cout<<(typeid(*pd)==typeid(D))<<endl;//1
cout<<(typeid(pb)==typeid(B*))<<endl;//1
cout<<(typeid(*pb)==typeid(D))<<endl;//1
cout<<(typeid(pb)==typeid(D*))<<endl;//0
cout<<(typeid(*pb)==typeid(B))<<endl;//0
cout<<(typeid(pb)==typeid(pd))<<endl;//0
cout<<(typeid(pb->b)==typeid(int))<<endl;//1
}