zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    [CLYZ2017]day8
    [CLYZ2017]day12
    [bzoj1503][NOI2004]郁闷的出纳员
    [CLYZ2017]day18
    [CLYZ2017]day11
    [CLYZ2017]day17
    在DLL中获取服务器路径
    SPSecurity.RunWithElevatedPrivileges 拒绝访问
    prototype1.4.0(转载)
    删除多表数据
  • 原文地址:https://www.cnblogs.com/XiHua/p/4750219.html
Copyright © 2011-2022 走看看