C++ typeid关键字详解

一、C++ typeid关键字详解

1、typeid的用法

typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要,它描述了数据的各种属性:

)对于基本类型(int、float 等C++内置类型)的数据,类型信息所包含的内容比较简单,主要是指数据的类型。
2)对于类类型的数据(也就是对象),类型信息是指对象所属的类、所包含的成员、所在的继承关系等。

注意:typeid是操作符,不是函数,这点与sizeof类似

typeid 的操作对象既可以是表达式,也可以是数据类型,下面是它的两种使用方法:
1)typeid( dataType )
2)typeid( expression ) typeid 会把获取到的类型信息保存到一个 type_info
类型的对象里面,并返回该对象的常引用;当需要具体的类型信息时,可以通过成员函数来提取

2、 type_info类常用的成员函数

1) name() 用来返回类型的名称。
2)raw_name() 用来返回名字编码(NameMangling)算法产生的新名称。关于名字编码的概念,可以到《C++函数编译原理和成员函数的实现》中查找。
3)hash_code() 用来返回当前类型对应的 hash 值,是标识当前类型的整数。

3、使用type_info

typeid 运算符经常被用来判断两个类型是否相等

3.1、基本类型的比较

int a = 20;
double b = 30;

bool flag = (typeid(a) == typeid(int));
cout << flag << endl;     // 输出结果:1

flag = (typeid(a) == typeid(double));
cout << flag << endl;     // 输出结果:0

flag = (typeid(b) == typeid(double));
cout << flag << endl;     // 输出结果:1

3.2、复杂类型的比较(基类不带虚函数)

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

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

int main()
{
    base *p = new derived;

    bool flag = (typeid(p) == typeid(base*));
    cout << flag << endl;     // 输出结果:1

    flag = (typeid(p) == typeid(derived*));
    cout << flag << endl;     // 输出结果:0

    flag = (typeid(*p) == typeid(base));
    cout << flag << endl;     // 输出结果:1

    flag = (typeid(*p) == typeid(derived));
    cout << flag << endl;     // 输出结果:0

    return 0;
}

3.3、复杂类型的比较(基类带虚函数)

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

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

int main()
{
    base *p = new derived;

    bool flag = (typeid(p) == typeid(base*));
    cout << flag << endl;     // 输出结果:1

    flag = (typeid(p) == typeid(derived*));
    cout << flag << endl;     // 输出结果:0

    flag = (typeid(*p) == typeid(base));
    cout << flag << endl;     // 输出结果:0

    flag = (typeid(*p) == typeid(derived));
    cout << flag << endl;     // 输出结果:1

    return 0;
}

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++中的所有关键字及其作用: 1. `auto`: 自动类型推导。 2. `break`: 终止循环或 switch 语句。 3. `case`: switch 语句中的分支。 4. `catch`: 捕获异常。 5. `char`: 字符类型。 6. `class`: 定义类。 7. `const`: 声明常量,或者表示函数不会修改对象。 8. `continue`: 跳过当前循环中的剩余代码。 9. `default`: switch 语句中的默认分支。 10. `delete`: 删除对象或释放动态分配的内存。 11. `do`: 循环语句,至少执行一次。 12. `double`: 双精度浮点数类型。 13. `dynamic_cast`: 运行时类型转换。 14. `else`: if 语句的分支。 15. `enum`: 枚举类型。 16. `explicit`: 显式构造函数或类型转换。 17. `export`: 指定函数或变量可在其他文件中使用。 18. `extern`: 声明变量或函数在其他文件中定义。 19. `false`: 布尔值假。 20. `float`: 单精度浮点数类型。 21. `for`: 循环语句。 22. `friend`: 友元函数或类。 23. `goto`: 跳转到标记的位置。 24. `if`: 条件语句。 25. `inline`: 内联函数。 26. `int`: 整数类型。 27. `long`: 长整数类型。 28. `mutable`: 声明类成员变量可修改。 29. `namespace`: 命名空间。 30. `new`: 分配动态内存。 31. `operator`: 自定义运算符。 32. `private`: 类访问控制,只能在类内部访问。 33. `protected`: 类访问控制,派生类可访问。 34. `public`: 类访问控制,任何地方都可访问。 35. `register`: 声明寄存器变量。 36. `reinterpret_cast`: 指针类型转换。 37. `return`: 返回函数值。 38. `short`: 短整数类型。 39. `signed`: 带符号整数类型。 40. `sizeof`: 获取类型或变量的大小。 41. `static`: 静态变量或函数,只在当前文件中可见。 42. `static_cast`: 静态类型转换。 43. `struct`: 定义结构体。 44. `switch`: 多分支选择语句。 45. `template`: 模板类或函数。 46. `this`: 指向当前对象的指针。 47. `throw`: 抛出异常。 48. `true`: 布尔值真。 49. `try`: 异常处理语句。 50. `typedef`: 定义类型别名。 51. `typeid`: 获取对象类型信息。 52. `typename`: 指示后面的标识符是类型名。 53. `union`: 联合类型。 54. `unsigned`: 无符号整数类型。 55. `using`: 声明命名空间中的符号。 56. `virtual`: 虚函数。 57. `void`: 空类型。 58. `volatile`: 声明变量可能被意外修改。 59. `wchar_t`: 宽字符类型。 以上是C++中的所有关键字及其作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值