• C++学习笔记29:运行期型式信息2


    static_cast

    静态转型的用途

    • 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式
    • 一般用于非类型式的普通数据对象转型

    静态转型的问题

    • 不进行运行期型式检查,不安全
    • 若转型失败,结果无定义

    const_cast

    常量转型的目的

    • 用于取消或者设置量的const状态(如设置为const或者取消const)

    常量转型的问题

    • 如果原始数据对象不能写入,则取消常量修饰可能会导致未知的结果

    例子:

    #include <iostream>
    
    class ConstCastTest
    {
    public:
        void SetNum(int num) { _num = num; }
        void PrintNum() const;
    private:
        int _num;
    };
    
    void ConstCastTest::PrintNum() const
    {
        //临时取消常量约束,修改目标对象的内容
        //this指向const ConstCastTest*,指向常对象的指针
        const_cast<ConstCastTest*>(this)->_num--;
        std::cout << _num;
    }

    reinterpret_cast

    复诠转型的目的

    • 将任意型式的数据对象转型为目标型式,即重新解释其位序列的意义
    • 可以用于整型与指针型的互转

    复诠转型的问题

    • 由程序员保证重新解释的数据对象是否有意义,编译器简单按照目标型式理解该存储区的内容
    • 注意:在64位操作系统中,指针可能为64位,而整型可能为32位,复诠转型有可能丢失数据或者得到错误结果

    例子:

    #include <iostream>
    using namespace std;
    
    int f(void *p)
    {
        unsigned int n = reinterpret_cast<unsigned int>(p);
        return n;
    }
    
    int main()
    {
        int a[8] = { 1,2,3,4,5,6,7,8 };
        int n = f(a);
        cout << n << endl;
    }
    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    (转)TweenMax动画库学习(三)
    (转)TweenMax动画库学习(二)
    (转)TweenMax动画库学习(一)
    深入剖析Java中的装箱与拆箱(转)
    Spring MVC 和 Spring 总结(转)
    react native for android(ajax)
    React Native HelloWorld
    C# JMAIL发送邮件
    C# 接收邮件
    Spring Mvc Mybatis(初次学习)
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6250401.html
Copyright © 2020-2023  润新知