wordpress 权限 分类,seo优化方案怎么写,做任务赚q币网站,上海普陀网站建设公司typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要#xff0c;它描述了数据的各种属性#xff1a; 对于基本类型#xff08;int、float 等C内置类型#xff09;的数据#xff0c;类型信息所包含的内容比较简单#xff0c;主要是指数据的类型。对…typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要它描述了数据的各种属性 对于基本类型int、float 等C内置类型的数据类型信息所包含的内容比较简单主要是指数据的类型。对于类类型的数据也就是对象类型信息是指对象所属的类、所包含的成员、所在的继承关系等。类型信息是创建数据的模板数据占用多大内存、能进行什么样的操作、该如何操作等这些都由它的类型信息决定。
typeid 的操作对象既可以是表达式也可以是数据类型下面是它的两种使用方法
typeid( dataType )
typeid( expression )dataType 是数据类型expression 是表达式这和 sizeof 运算符非常类似只不过 sizeof 有时候可以省略括号( )而 typeid 必须带上括号。
typeid 会把获取到的类型信息保存到一个 type_info 类型的对象里面并返回该对象的常引用当需要具体的类型信息时可以通过成员函数来提取。typeid 的使用非常灵活请看下面的例子
#include iostream
#include typeinfo
using namespace std;class Base{ };struct STU{ };int main(){//获取一个普通变量的类型信息int n 100;const type_info nInfo typeid(n);coutnInfo.name() | nInfo.raw_name() | nInfo.hash_code()endl;//获取一个字面量的类型信息const type_info dInfo typeid(25.65);coutdInfo.name() | dInfo.raw_name() | dInfo.hash_code()endl;//获取一个对象的类型信息Base obj;const type_info objInfo typeid(obj);coutobjInfo.name() | objInfo.raw_name() | objInfo.hash_code()endl;//获取一个类的类型信息const type_info baseInfo typeid(Base);coutbaseInfo.name() | baseInfo.raw_name() | baseInfo.hash_code()endl;//获取一个结构体的类型信息const type_info stuInfo typeid(struct STU);coutstuInfo.name() | stuInfo.raw_name() | stuInfo.hash_code()endl;//获取一个普通类型的类型信息const type_info charInfo typeid(char);coutcharInfo.name() | charInfo.raw_name() | charInfo.hash_code()endl;//获取一个表达式的类型信息const type_info expInfo typeid(20 * 45 / 4.5);coutexpInfo.name() | expInfo.raw_name() | expInfo.hash_code()endl;return 0;
}运行结果
int | .H | 529034928
double | .N | 667332678
class Base | .?AVBase | 1035034353
class Base | .?AVBase | 1035034353
struct STU | .?AUSTU | 734635517
char | .D | 4140304029
double | .N | 667332678从本例可以看出typeid 的使用非常灵活它的操作数可以是普通变量、对象、内置类型int、float等、自定义类型结构体和类还可以是一个表达式。
type_info 类的成员函数的介绍 name() 用来返回类型的名称。raw_name() 用来返回名字编码Name Mangling算法产生的新名称。hash_code() 用来返回当前类型对应的 hash 值。hash 值是一个可以用来标志当前类型的整数有点类似学生的学号、公民的身份证号、银行卡号等。不过 hash 值有赖于编译器的实现在不同的编译器下可能会有不同的整数但它们都能唯一地标识某个类型。C 标准规定type_info 类至少要有如下所示的 4 个 public 属性的成员函数其他的扩展函数编译器开发者可以自由发挥不做限制。
1 原型const char name() const;* 返回一个能表示类型名称的字符串。但是C标准并没有规定这个字符串是什么形式的。
2 原型bool before (const type_info rhs) const; 判断一个类型是否位于另一个类型的前面rhs 参数是一个 type_info 对象的引用。但是C标准并没有规定类型的排列顺序不同的编译器有不同的排列规则程序员也可以自定义。要特别注意的是这个排列顺序和继承顺序没有关系基类并不一定位于派生类的前面。
3 原型bool operator (const type_info rhs) const; 重载运算符“”判断两个类型是否相同rhs 参数是一个 type_info 对象的引用。
4 原型bool operator! (const type_info rhs) const; 重载运算符“!”判断两个类型是否不同rhs 参数是一个 type_info 对象的引用。
判断类型是否相等
typeid 运算符经常被用来判断两个类型是否相等。
1 内置类型的比较 例如有下面的定义
char *str;
int a 2;
int b 10;
float f;类型判断结果为 typeid 返回 type_info 对象的引用而表达式typeid(a) typeid(b)的结果为 true可以说明一个类型不管使用了多少次编译器都只为它创建一个对象所有 typeid 都返回这个对象的引用。
需要提醒的是为了减小编译后文件的体积编译器不会为所有的类型创建 type_info 对象只会为使用了 typeid 运算符的类型创建。不过有一种特殊情况就是带虚函数的类包括继承来的不管有没有使用 typeid 运算符编译器都会为带虚函数的类创建 type_info 对象。
2 类的比较 例如有下面的定义
class Base{};
class Derived: public Base{};Base obj1;
Base *p1;
Derived obj2;
Derived *p2 new Derived;
p1 p2;类型判断结果为
表达式typeid(p1) typeid(Base)和typeid(p1) typeid(Base)的结果为 true 可以说明即使将派生类指针 p2 赋值给基类指针 p1p1 的类型仍然为 Base*。
type_info 类的声明
type_info 类位于typeinfo头文件声明形式类似于
class type_info {
public:virtual ~type_info();int operator(const type_info rhs) const;int operator!(const type_info rhs) const;int before(const type_info rhs) const;const char* name() const;const char* raw_name() const;
private:void *_m_data;char _m_d_name[1];type_info(const type_info rhs);type_info operator(const type_info rhs);
};它的构造函数是 private 属性的所以不能在代码中直接实例化只能由编译器在内部实例化。而且还重载了“”运算符也是 private 属性的所以也不能赋值。