加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ typeid运算符判断类型是否相等

发布时间:2023-06-07 13:21:03 所属栏目:语言 来源:
导读:typeid 运算符经常被用来判断两个类型是否相等。
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 属性的,所以也不能赋值。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章