• C++ Primer 笔记——运行时类型识别


    1.dynamic_cast运算符的使用形式如下:

    dynamic_cast<type*>(e)    // e必须是一个有效指针
    dynamic_cast<type&>(e)    // e必须是一个左值
    dynamic_cast<type&&>(e)    // e不能是一个左值


    2.如果一条dynamic_cast 语句的转换目标是指针类型并且失败了,则结果为0,如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个bad_cast异常(因为不存在空引用)。

    3.我们可以对一个空指针执行dynamic_cast,结果是所需类型的空指针。

    4.typeid 表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字。结果是一个常量对象的引用,该对象的类型是标准库类型type_info或者type_info的公有派生类型。当typeid作用于指针时(而非指针所指的对象),返回结果是该指针的静态编译时类型。

    int *p = new int(1);
    int *q = new int(1);
    
    typeid(*p) == typeid(*q);    // true
    typeid(*p) == typeid(int);    // true
    typeid(p) == typeid(int);    // false

    5.typeid运算符可以作用于任意类型的表达式,顶层const被忽略如果表达式是一个引用,则typeid返回该引用所引对象的类型。当typeid作用于数组或函数时,并不会执行向指针的标准类型转换,也就是说我们对数组类型得到的结果是数组类型而非指针类型。

    6.typeid是否需要运行时检查决定了表达式是否会被求值。只有当类型含有虚函数时,编译器才会对表达式求值,如果类型不含有虚函数,则typeid返回表达式的静态类型,因为编译器无须对表达式求值也能知道表达式的静态类型。如果需要求值得时候指针是空指针,则将抛出一个名为bad_typeid的异常。

    7.type_info类的精确定义随着编译器的不同而略有差异。不过,C++标准规定type_info类必须在typeinfo头文件中,并且至少提供以下操作:

    8.type_info类一般是作为一个基类出现,所以它还应该提供一个公有的虚析构函数,当编译器希望提供额外的类型信息时,通常在type_info的派生类中完成。type_info类没有默认构造函数,而且拷贝和移动构造函数以及赋值运算符都被定义成删除的。因此,我们无法定义或拷贝type_info类型的对象,也不能为type_info类型的对象赋值。创建type_info对象的唯一途径是使用typeid运算符。

  • 相关阅读:
    php框架laravel:数据库建立:artisan
    SpringCloud微服务(03):Hystrix组件,实现服务熔断
    SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡
    SpringCloud微服务(01):Eureka组件,管理服务注册与发现
    SpringBoot2基础,进阶,数据库,中间件等系列文章目录分类
    Java描述设计模式(04):抽象工厂模式
    Java描述设计模式(03):工厂方法模式
    Java描述设计模式(02):简单工厂模式
    Java描述设计模式(01):单例模式
    SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/7460524.html
Copyright © 2020-2023  润新知