C++强制类型转换

C++中的强制类型转换虽然兼容C语言中的强制类型转换,但是不建议在C++中使用C语言风格的强制类型转换。C++中的强制类型转换共有4种:static_cast,dynamic_cast、const_c

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

  C++中的强制类型转换虽然兼容C语言中的强制类型转换,但是不建议在C++中使用C语言风格的强制类型转换。C++中的强制类型转换共有4种:static_cast,dynamic_cast、const_cast、reinterpret_cast.

static_cast

1. 使用格式

  进行编译期间的类型检查

  type1 a;

  type2 b = static_cast<type1>(a);

2. 使用范围

  (1)基本数据类型之间的转换,如int->double;

    int a = 6;

    double b = static_cast<int>(a);

  (2)派生体系中向上转型:将派生类指针或引用转化为基类指针或引用

dynamic_cast

  (1)执行派生类指针或引用与基类指针或引用之间的转换。

  (2)使用多态的场景,增加了一层对真实调用对象类型的检查,可以实现向上转型和向下转型,前提是必须使用public或protected继承

  (3)dynamic_cast不是强制转换,而是带有某种”咨询“性质的,如果不能转换,返回NULL。这是强制转换做不到的。

const_cast

  (1)去除const常量属性,使其可以修改

reinterpret_cast

  仅仅是复制n1的比特位到d_r, 没有进行必要的分析.interpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话。

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

class A {
    public:
    A(){};
    int m_a;
};

class B {
    public:
    int m_b;
};

class C : public A, public B {};

int main()
{
    const A a;
    //a.m_a= 1;
    const_cast<A&>(a).m_a = 2;
    //a.m_a= 3;编译不能通过,说明const_cast只能转换一次,不是永久脱离原有const属性
    cout<<a.m_a<<endl;
    int n = 9;
    double d_s = static_cast<double>(n);
    double d_r = reinterpret_cast<double&>(n);
    cout<<d_r<<endl;//4.24399e-314
    //在进行计算以后, d_r包含无用值. 这是因为 reinterpret_cast\
     仅仅是复制n1的比特位到d_r, 没有进行必要的分析.interpret_cast是为了映射到一个完全不同类型\
     的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄\
     玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话

    C c;
    printf("%p, %p, %p\n", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
    //前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,\
    并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换\
    因此, 你需要谨慎使用 reinterpret_cast.


    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120152.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言学生成绩管理系统

    C语言实现了学生成绩管理系统,可以对学生成绩进行录入、查询、修改、删除和排序。#include&amp;amp;lt;stdio.h&amp;amp;gt;#include&amp;amp;lt;stdlib.h&amp;amp;gt;#include&amp;amp;lt;string.h&amp;amp;gt;typedefstructStuScore{ intstuID; charstuName[10]; intyuwen;

    2022年4月9日
    56
  • CAD常用命令、快捷键和命令说明大全 「建议收藏」

    CAD常用命令、快捷键和命令说明大全 「建议收藏」CAD常用命令、快捷键和命令说明大全一:常用功能键F1:获取帮助F2:实现作图窗和文本窗口的切换F3:控制是否实现对象自动捕捉F4:数字化仪控制F5:等轴测平面切换F6:控制

    2022年8月6日
    4
  • Linux文件系统详解

    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考:http://blog.chinaunix.net/uid-8698570-id-1763151.htmlhttp://www.iteye.com/topic/816268http://soft.chinabyte.com/os/142…

    2022年4月3日
    54
  • 狂神说Linux_狂神说docker笔记

    狂神说Linux_狂神说docker笔记Linux在服务器端,很多大型项目都是部署在Linux服务器上利用VM + Centos7搭建本地Linux系统你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。概念云服务器就是一个远程电脑Linux中一切皆文件根目录/,所有的文件都挂载在这个节点下/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备

    2022年8月8日
    2
  • Android源码学习「建议收藏」

    Android源码学习「建议收藏」作为一名程序员,肯定不仅仅限于使用API文档,因为浮于表面是远远不够的。进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。引用Google的一张框架图:Applications层,和用户直接交互的就是这些应用程序,它们都是用Java开发的。 JavaFramework层,这一层大部分用Java语言编写。它是An…

    2022年6月6日
    27
  • Codeblocks中文乱码解决方法。[通俗易懂]

    Codeblocks中文乱码解决方法。[通俗易懂]Codeblocks中文乱码解决方法。 如需安装包请后台留言!!Codeblocks中文乱码解决方法:特别提示:出现中文乱码情况才执行以下操作,未出现请勿随意修改!!!!打开Codeblocks-&gt;设置-&gt;编辑器:然后点击Encodingsettings-&gt;选择编码-&gt;选择UTF-8-…

    2022年7月14日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号