c++ typeid函数

在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。
dynamic_cast允许运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转化类型,与之相对应的还有一个非安全的转换操作符static_cast,因为这不是本文的讨论重点,所以这里不再详述,感兴趣的可以自行查阅资料。下面就开始今天我们的话题:typeid。

typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)。
如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

type_info类提供了public虚 析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的 友元)。type_info的name成员函数返回C-style的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致(往往如此,见后面的程序),这具体由编译器的实现所决定的,标准只要求实现为每个类型返回唯一的字符串。

#include <iostream>
using namespace std;

class Base {
    virtual void f(){};
};
class Derived: public Base {};

int main()
{
    Base b, *pb;
    pb = NULL;
    Derived d;

    cout << typeid(int).name() << endl
         << typeid(unsigned).name() << endl
         << typeid(long).name() << endl
         << typeid(unsigned long).name() << endl
         << typeid(char).name() << endl
         << typeid(unsigned char).name() << endl
         << typeid(float).name() << endl
         << typeid(double).name() << endl
         << typeid(string).name() << endl
         << typeid(Base).name() << endl
         << typeid(b).name()<<endl
         << typeid(pb).name()<<endl
         << typeid(Derived).name() << endl
         << typeid(d).name()<<endl
         << typeid(type_info).name() << endl;


    Base *pb2 = dynamic_cast<Base *>(new Derived);
    Base &b2 = d;
    Base *pb3 = &d;

    cout<<"hello"<<endl;
    
    cout << typeid(pb2).name() <<endl//输出P4Base
         << typeid(b2).name()<<endl //输出7Derived
         << typeid(pb3).name()<<endl//输出P4Base
         << typeid(*pb3).name()<<endl;//输出7Derived


    cout<< typeid(7.84).name() <<endl  //输出d
        << typeid(Base*).name() <<endl //输出P4Base
        << typeid(&pb3).name() <<endl; //输出:PP4Base
    return 0;
}

输出:

i
j
l
m
c
h
f
d
NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
4Base
4Base
P4Base
7Derived
7Derived
St9type_info
dynamic:
P4Base
7Derived
P4Base
7Derived
d
P4Base
PP4Base
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ 的 `typeid` 是一个运算符,用于获取表达式的类型信息。它返回一个 `type_info` 对象,该对象包含有关表达式的类型的信息。 `type_info` 是一个类,定义在 `<typeinfo>` 头文件中。它提供了一些成员函数和操作符,可以用于比较类型信息、获取类型名称等。 以下是 `typeid` 运算符的基本用法: ```cpp #include <iostream> #include <typeinfo> class Base { public: virtual ~Base() {} }; class Derived : public Base {}; int main() { Base* basePtr = new Derived(); // 使用 typeid 获取指针指向对象的类型信息 const std::type_info& typeInfo = typeid(*basePtr); // 使用 type_info 的成员函数 name() 获取类型名称 std::cout << "Type name: " << typeInfo.name() << std::endl; delete basePtr; return 0; } ``` 在上述示例中,定义了一个基类 `Base` 和一个派生类 `Derived`。在 `main` 函数中,创建了一个指针 `basePtr`,指向 `Derived` 类的对象。然后使用 `typeid(*basePtr)` 获取指针指向对象的类型信息,并将结果保存在 `typeInfo` 中。 通过 `typeInfo.name()` 成员函数可以获取类型名称,并将其输出到标准输出流中。 需要注意的是,`typeid` 运算符所返回的 `type_info` 对象是在运行时获取的类型信息,因此它适用于多态类型。而对于非多态类型,`typeid` 运算符返回的是编译时的类型信息。 还可以使用 `typeid` 运算符来比较两个类型是否相同。例如,`typeid(a) == typeid(b)` 可以用于比较变量 `a` 和 `b` 的类型是否相同。如果相同,则返回 `true`;不同,则返回 `false`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝鲸123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值