• 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)为真。

  • 相关阅读:
    January 25th, 2018 Week 04th Thursday
    January 24th, 2018 Week 04th Wednesday
    January 23rd, 2018 Week 04th Tuesday
    January 22nd, 2018 Week 04th Monday
    January 21st, 2018 Week 3rd Sunday
    January 20th, 2018 Week 3rd Saturday
    January 19th, 2018 Week 3rd Friday
    January 18th, 2018 Week 03rd Thursday
    January 17th, 2018 Week 03rd Wednesday
    January 16th, 2018 Week 03rd Tuesday
  • 原文地址:https://www.cnblogs.com/yongpan/p/7690242.html
Copyright © 2020-2023  润新知