36 CPP typeid运算符和type_info类

本文详细介绍了C++中typeid运算符和type_info类的应用,包括它们在判断数据类型、多态场景下的作用,以及注意事项。示例代码展示了如何使用typeid获取不同类型变量的type_info,并通过type_info的==和!=运算符比较类型。同时,强调了不应依赖name()函数返回的字符串来判断类型,因编译器可能转换类型名。

36 CPP typeid运算符和type_info类

 

type_info 重载了==和!=运算符,用于对类型进行比较

注意:

1 type_info类的构造函数是private属性,也没有拷贝构造函数,所以不能直接实例化,只能由编译器在内部实例化

2 不建议用name()成员函数返回的字符串作为判断数据类型的依据。(编译器可能会转换类型名)

3 typeid运算符可以用于多态的场景,在运行阶段识别对象的数据类型。

4 假设有表达式typeid(*ptr),当ptr是空指针时,如果ptr是多态的类型,将引发bad_typeid异常。

#include "iostream"
using namespace std;
class AA
{
};
void test()
{
    // typeid用于内置数据类型
    int num = 3;
    int *pi = #
    int &ri = num;
    cout << "typeid(int)=" << typeid(int).name() << endl;
    cout << "typeid(num)=" << typeid(num).name() << endl;
    cout << "typeid(int *)=" << typeid(int *).name() << endl;
    cout << "typeid(pi)=" << typeid(pi).name() << endl;
    cout << "typeid(int &)=" << typeid(int &).name() << endl;
    cout << "typeid(ri)=" << typeid(ri).name() << endl;

    // typeid用于自定义数据类型
    AA aa;
    AA *paa = &aa;
    AA &raa = aa;
    cout << "typeid(AA)=" << typeid(AA).name() << endl;
    cout << "typeid(aa)=" << typeid(aa).name() << endl;
    cout << "typeid(AA *)=" << typeid(AA *).name() << endl;
    cout << "typeid(paa)=" << typeid(paa).name() << endl;
    cout << "typeid(AA &)=" << typeid(AA &).name() << endl;
    cout << "typeid(raa)=" << typeid(raa).name() << endl;

    // type_info 重载了==和!=运算符,用于对类型进行比较
    if (typeid(AA) == typeid(aa))
    {
        cout << "ok1" << endl;
    }
}
int main()
{
    test();
    return 0;
}
typeid(int)=i
typeid(num)=i
typeid(int *)=Pi
typeid(pi)=Pi
typeid(int &)=i
typeid(ri)=i
typeid(AA)=2AA
typeid(aa)=2AA
typeid(AA *)=P2AA
typeid(paa)=P2AA
typeid(AA &)=2AA
typeid(raa)=2AA
ok1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值