zoukankan      html  css  js  c++  java
  • 4.8 C++ typeid操作符

    参考:http://www.weixueyuan.net/view/6378.html

    总结:

      typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。

      如果需要使用typeid操作符,最好加上typeinfo头文件。

      操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。

    typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符,最好加上typeinfo头文件。

    给出以下定义

    int a;
    double b;
    char * c;
    long d;

    下表列出了使用typeid操作符的表达式的值:

    表达式
    typeid(a) == typeid(int) true
    typeid(a) == typeid(float) false
    typeid(a) == typeid(int *) false
    typeid(b) == typeid(double) true
    typeid(b) == typeid(float) false
    typeid(b) == typeid(long double) false
    typeid(c) == typeid(char *) true
    typeid(c) == typeid(char) false
    typeid(c) == typeid(string) false
    typeid(d) == typeid(long) true
    typeid(d) == typeid(int) false


    操作符typeid返回的是一个type_info类(用于描述数据类型的一个系统类)对象的引用。这个操作符可以用于表达式和类型名(包括自定的数据类型,比如类)。

    例1:

    class base
    {
    public :
        virtual void m(){cout<<"base"<<endl;}
    };
    
    class derived : public base
    {
    public:
        void m(){cout<<"derived"<<endl;}
    };

    假设我们如本例所示定义了两个类base类和derived类,基于这两个类定义,我们定义指针如下:
        base * p = new derived;

    下表将给出使用typeid操作符的结果。

    表达式
    typeid(p) == typeid(base*) true
    typeid(p) == typeid(derived*) false
    typeid(*p) == typeid(base) false
    typeid(*p) == typeid(derived) true


    对于表达式typeid(p),因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),因为base类具有多态性,因而在计算typeid(*p)时会根据运行时p所指向的实际类型去计算,而本例中p指向的是派生类对象,因此表达式typeid(*p) == typeid(derived)为真,typeid(*p) == typeid(base)为假。

    例2:

    class base
    {
    public :
        void m(){cout<<"base"<<endl;}
    };
     
    class derived : public base
    {
    public:
        void m(){cout<<"derived"<<endl;}
    };

    假设我们根据例2中定义的两个类来定义如下指针:
        base * p = new derived;

    下表将给出使用typeid操作符的结果。

    表达式
    typeid(p) == typeid(base*) true
    typeid(p) == typeid(derived*) false
    typeid(*p) == typeid(base) true
    typeid(*p) == typeid(derived) false


    对于表达式typeid(p),同样,因为p是base*类型的指针,因此typeid(p) == typeid(base*)为真,而typeid(p) == typeid(derived*)为假。而对于表达式typeid(*p),由于此时的基类不具有多态性,因而*p将会采用编译期类型来计算,编译期*p是base对象,因此表达式typeid(*p) == typeid(derived)为假,typeid(*p) == typeid(base)为真。

  • 相关阅读:
    [原创软件]友盟自动添加版本工具
    【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统
    【Python3.6+Django2.0+Xadmin2.0系列教程之二(入门篇-中)】学生信息管理系统
    [原创软件]PC端与移动端文件信息互通工具
    【Python3.6+Django2.0+Xadmin2.0系列教程之一(入门篇-上)】环境搭建及项目创建
    [原创软件]考勤查询工具
    [原创软件]友盟自定义事件批量上传器
    [原创软件]全线升级管理平台
    三步走起 提升 iOS 审核通过率 下篇
    三步走起 提升 iOS 审核通过率 上篇
  • 原文地址:https://www.cnblogs.com/yongpan/p/7690242.html
Copyright © 2011-2022 走看看