• C++技术问题总结-第0篇 类型转换


    从今天開始,对C++经常使用技术做个总结。

    參考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。


    1. static_cast等四个cast的详细意义

    C++类型转换:隐式转换和显式转换。

    显式转换:static_castdynamic_castreinterpret_castconst_cast


    1.1. static_cast

    使用方法:static_cast<type-id>(expression)

    说明:该运算符把expression转换为type-id类型,但没有执行时类型检查来保证转换的安全性。

    来源:为什么须要static_cast类型强制转换?

    (1)void指针->其它类型指针。

    (2)改变通常的标准转换。

    (3)避免出现可能多种转换的歧义。

    几种使用方法:

    (1)类层次中基类和子类之间指针或引用的转换。

    进行上行转换(把子类的指针或引用转换成基类)是安全的。

    进行下行转换(把基类的指针或引用转换成子类)时,因为没有动态类型检查,所以是不安全的。

    (2)用于基本数据类型之间的转换,如把int转换成char等。

    这样的转换的安全性也要开发者来保证。

    (3)把void指针转换成目标类型的指针(不安全)。

    (4)把不论什么类型的表达式转换成void类型。

    1.2. dynamic_cast

    使用方法:dynamic_cast<type-id>(expression)

    说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、引用或void*

    将基类类型的指针或引用安全地转换为派生类型的指针或引用。

    一次运行两个操作。它首先验证被请求的转换是否有效,仅仅有转换有效,操作符才实际进行转换。

    流程图。


    来源:为什么须要dynamic_cast

    简单来说,当无法使用virtual函数的时候。不能改动源代码时,才这么干。

    在类层次间进行上行转换时,dynamic_caststatic_cast的效果是一样的,在进行下行转换时,dynamic_cast是具有类型检查的功能。


    1.3. reinterpret_cast

    使用方法:reinterpret_cast<type-id>(expression)

    说明:type-id必须是一个指针、引用、算术类型、函数指针或成员指针。

    使用方法:它能够把一个指针转换成一个整数,或进行相反操作。


    1.4. const_cast

    使用方法:const_cast<type-id>(expression)

    说明:该运算符用来改动类型的constvolatile属性。

    常量指针或引用被转化成很量指针或引用,而且仍然指向原对象。

    常量对象被转换成很量对象。

    个人理解:个人不经常使用,这个使用方法违反了设计原意。

    演示样例:

    class B {public: int m_iNum;};
    void foo(){
        const B b1;
        b1.m_iNum = 1000;//编译失败,由于b1是常量
        B& b2=const_cast<B&>(b1);
        b2.m_iNum=200;//fine,b1、b2的m_iNum值都为200
    }
    

  • 相关阅读:
    Linux设备驱动程序 之 度量时间差
    mysql外键的使用
    tomcat常用配置详解和优化方法
    什么是跨域?跨域解决方法
    springboot+vue项目实战
    利用MySQL数据库如何解决大数据量存储问题?
    在MySQL中存储大文件
    web开发用到的技术
    网络100个知识点
    jetty使用教程
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4301875.html
Copyright © 2020-2023  润新知