C++ typeid运算符判断类型是否相等
发布时间:2023-06-07 13:21:03 所属栏目:语言 来源:
导读:typeid 运算符经常被用来判断两个类型是否相等。
1) 内置类型的比较
例如有下面的定义:
char *str;
int a = 2;
int b = 10;
float f;
类型判断结果为:
类型比较 结果 类型比较 结果
typeid(int)
1) 内置类型的比较
例如有下面的定义:
char *str;
int a = 2;
int b = 10;
float f;
类型判断结果为:
类型比较 结果 类型比较 结果
typeid(int)
typeid 运算符经常被用来判断两个类型是否相等。 1) 内置类型的比较 例如有下面的定义: char *str; int a = 2; int b = 10; float f; 类型判断结果为: 类型比较 结果 类型比较 结果 typeid(int) == typeid(int) true typeid(int) == typeid(char) false typeid(char*) == typeid(char) false typeid(str) == typeid(char*) true typeid(a) == typeid(int) true typeid(b) == typeid(int) true typeid(a) == typeid(a) true typeid(a) == typeid(b) true typeid(a) == typeid(f) false typeid(a/b) == typeid(int) true typeid 返回 type_info 对象的引用,而表达式typeid(a) == typeid(b)的结果为 true,可以说明,一个类型不管使用了多少次,编译器都只为它创建一个对象,所有 typeid 都返回这个对象的引用。 需要提醒的是,为了减小编译后文件的体积,编译器不会为所有的类型创建 type_info 对象,只会为使用了 typeid 运算符的类型创建。不过有一种特殊情况,就是带虚函数的类(包括继承来的),不管有没有使用 typeid 运算符,编译器都会为带虚函数的类创建 type_info 对象,我们将在《C++ RTTI机制精讲(C++运行时类型识别机制)》中展开讲解。 2) 类的比较 例如有下面的定义: class Base{}; class Derived: public Base{}; Base obj1; Base *p1; Derived obj2; Derived *p2 = new Derived; p1 = p2; 类型判断结果为: 类型比较 结果 类型比较 结果 typeid(obj1) == typeid(p1) false typeid(obj1) == typeid(*p1) true typeid(&obj1) == typeid(p1) true typeid(obj1) == typeid(obj2) false typeid(obj1) == typeid(Base) true typeid(*p1) == typeid(Base) true typeid(p1) == typeid(Base*) true typeid(p1) == typeid(Derived*) false 表达式typeid(*p1) == typeid(Base)和typeid(p1) == typeid(Base*)的结果为 true 可以说明:即使将派生类指针 p2 赋值给基类指针 p1,p1 的类型仍然为 Base*。 type_info 类的声明 最后我们再来看一下 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 属性的,所以也不能赋值。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |