• C++ 4 种具有更 为准确语义的新强制转换类型


    1. static_cast<T>() 可用于把指向A 的指针强制转换为指向B 的指针,
    其约束条件是类B必须是类A的子类。例如:
    A *obj = new B;
    B *b = static_cast<B *>(obj);
    如果该对象不是B 的一个实例,那么使用结果指针将可以导致莫名其妙的系统崩溃。


    2.dynamiolcast <T>()与static_cast <T>()类似,只是它使用的是运行时类型信息(RTTI,runtime
    type information)的方法来验证与这个指针相关的对象obj是否是类B 的一个实例。如果不是,
    强制转换就会返回一个空指针null. 例如:
    A *obj = new B;
    B *b = dynamic_cast<B *>(obj);
    if (b)
      b->someFunctionDeclaredInB() ;

    在某些编译器中,dynamic_cast<T>()不能跨动态库工作。它也依赖于编译器对RTTI的支持,
    但为了减小,可执行文件的大小,程序员可以关闭对RTTI的支持这一特色。
    Qt过对Object的子类提供qobject_cast <T>()'来解决这些问题。T类必须是 QObject或者QObject子类继承而来的

    3.const_cast<T>()添加或移除对指针或者引用的const 限定。
    例如:
    int MyClass::someConstFunction() const
    {
    if(isDirty()
    {
    MyClass *that = const_cast<MyClass *>(this);
    that->recomputeInternalData();
    }

    在前面的例子中,我们舍弃了对this指针的const 限定,是为了调用非const成员函数recomputeInternalData();

    (但不推荐这种做法,并且也通常可以通过使用mutable 关键字来避免这种做法。)

    4、

    reinterpre_cast<T>() 把任意类型的指针或者引用转换成任意的其他类型。例如:
    short j = 0x1234;
    if (reinterpret_cast<char &>(j) == oxl2)
    std::cout << "The byte order is big-endian" << std::endl;

  • 相关阅读:
    同步 异步 阻塞 非阻塞深入理解
    TCP的三次握手四次挥手
    dom事件
    Vue 无痕 刷新页面
    事件冒泡 捕获 事件流
    gulp
    懒加载
    Object.prototype.toString.call() 判断某个对象属于哪种内置类型 type instanceof Object.prototype.toString.call 区别
    css sass less
    node module.exports exports
  • 原文地址:https://www.cnblogs.com/XiHua/p/4750219.html
Copyright © 2020-2023  润新知