zoukankan      html  css  js  c++  java
  • 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代码规范
    text-indent: -999px;是什么意思
    MYSQL中的普通索引,主健,唯一,全文索引区别
    Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别
    flush privileges是什么意思?
    大长今
    深入理解this对象
    如何将js与HTML完全脱离
    php页面相互调用的知识点
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/7460524.html
Copyright © 2011-2022 走看看