zoukankan      html  css  js  c++  java
  • RTTI和4个强制转换运算符

    因为虚函数/继承等等造成的C++的多态特性,使得C++程序在编译时没有办法确认每个对象的具体类型。

    与之对应的,就必然提供一个方法在运行时用来判断对象的具体类型,也就是RTTI,运行时类型标识符。 

    RTTI的编译器本质是在虚函数表中偷偷隐藏了一个指针,这个指针指向一个数据结构,这个数据结构记录了该类的真实类型信息。也就是typ_info。因为这个指针是藏在虚函数表中的,显而易见的:所有和动态类型判定有关系的都是对发生了虚继承(出现了virtual)的类的对象产生。

    typeid

    #include <typeinfo>
    typeid(
    object)

    typeid(object)就是建立在RTTI之上的一个函数。它用来返回对象实际类型的信息,也就是一个type_info类对象的引用。

    type_info类包含以下共有成员

    bool opereator==(const type_info &ob);
    bool opereator!=(const type_info &ob);
    bool before(const type_info &ob);
    const char *name();

    typeid对多态类型才起作用。也就是类体系中,有virtual。 

    从本质上说typeid是以RTTI为基础,没有virtual的类体系,在编译时即可确定类型,它们是不会被RTTI管辖的。

    dynamic_cast

    dynamic_cast<target-type> (expr)

    dynamic_cast会判断expr能否被正确转换为target-type,也就是利用RTTI判断目标类型是不是expr的1)真实类型2)父类或3)祖..父类,是就强制转换。如果不是,就不转换,并抛出一个bad_cast。

    const_cast

    const_cast<type> (expr)

    const_cast的意义根据语境有两个截然相反的两个

    1)如果expr原先是const,则去除const;2)如果原先没有const,则加上const。

    static_cast

    也就是不执行类型检查的强制转换。可以看作跳过RTTI判断的dynamic_cast。效率提高。

    在可以安全static_cast的地方不要dynamic_cast。但在不能保证安全处,一定要dynamic。

    reinterpret_cast

    啥也不管的在不相干的类型之间转化,例如指针转整数,或者不同类型的指针之间。 

  • 相关阅读:
    位运算
    方法重载
    基本数据类型与引用数据类型参数
    带返回值方法的定义格式
    return使用
    方法的通用格式
    方法定义的格式
    google chrome developer tools
    Skolelinux
    ajax
  • 原文地址:https://www.cnblogs.com/mumuliang/p/1887532.html
Copyright © 2011-2022 走看看