C++中的类型转换

Auto.js凉了之后,我们该用啥?AutoX.js保姆级环境搭建与第一个脚本实战(2024最新) 本文详细介绍了AutoX.js作为Auto.js替代方案的环境搭建与脚本开发实战指南。从技术生态现状分析到2024最新环境配置,再到编写第一个实用脚本和进阶调试技巧,帮助开发者无缝迁移至AutoX.js平台。特别适合需要手机自动化的JavaScript开发者,涵盖从基础到企业级应用的全套解决方案。 阅读详情

一、概述

笔者曾经面试的时候遇到一个问题,在C++怎么改变const修饰的常量的值,当时我还想了一会,C语言的const修饰的常量是假常量,是可以通过指针修改的,而C++中的常量那可是一个真的常量,怎么修改呢!后来我想到了类型转换const_cast 去掉const属性转换。其实这道题我也不知道做对了没,回来也没有上网查过资料,借用一句话描述一下我这种性格吧,“不要和我比懒,我懒得和你比”。好了,废话不多说,让我们进入正题吧。我们都知道C语言的类型转换,其实C++中也有类型转换。C++提供了四种类型转换,分别适应不同的场合。

  • static_cast ——>静态类型转换。
  • reinterpreter_cast ——>重新解释类型转换。
  • dynamic_cast ——>子类和父类之间的多态类型转换。
  • const_cast ——>去掉const属性转换。

二、转换方式及相关案例

1、static_cast 静态类型转换

所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种
代码格式

static_cast<目标类型> cast

案例:

#include <iostream>
using namespace std;

int main()
{
    double dPi = 3.1415926;
    int iPi1 = (int)dPi;
    int iPi2 = dPi;

    int iPi3 = static_cast<int> (dPi);  

    cout << "dPi:" << dPi << "iPi1:" << iPi1 << "iPi2:" << iPi2 << "iPi3:" << iPi3 << endl;

    return 0; 
}
2、dynamic_cast 子类和父类之间的多态类型转换

形式

dynamic_cast<目标类型> (标识符)

案例:

#include <iostream>
using namespace std;

class Animal
{
public:
    virtual void cry() = 0;
    virtual void doWork() = 0;
};

class Cat : public Animal
{
public:
    virtual void cry()
    {
        cout << "喵喵~~~~" << endl;
    }
    virtual void doWork()
    {
        cout << "抓老鼠" << endl;
    }

};

class Dog :public Animal
{
public:
    virtual void cry()
    {
        cout << "汪汪~~" << endl;
    }
    virtual void doWork()
    {
        cout << "看家" << endl;
    }
};

int main(void)
{
    Animal *animal = NULL;
    animal = new Dog;
    animal->cry();
    animal->doWork();
    cout << " -----" << endl;
    Dog * dog = NULL;
    dog = dynamic_cast<Dog*>(animal); 
    if (dog != NULL)
    {
        cout << "转换成功" << endl;
        dog->cry();
        dog->doWork();
    }
    else 
    {
        cout << "转换失败" << endl;
    }
    Cat *cat = NULL;

    if (cat != NULL)
    {
        cout << "转换成功" << endl;
        cat->cry();
        cat->doWork();
    }
    else
    {
        cout << "转换失败" << endl;
    }
    delete animal;
    return 0;
}
3、const_cast 去掉const属性转换

目标类类型只能是指针或引用
形式:

const_cast<目标类型> (标识符)

案例:

const int a = 10; 
const int *a_p = &a; 
//把a_p的const 属性去掉
int *a_p1 = const_cast<int*>(a_p);
4、reinterpret_cast 重新解释类型转换

interpret 是解释的意思,reinterpret 即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。
形式:

reinterpret_cast<目标类型> (标识符)

案例:

#include <iostream>

using namespace std;

class Animal
{
public:
    virtual void cry() = 0;
    virtual void doWork() = 0;
};

class Cat : public Animal
{
public:
    virtual void cry()
    {
        cout << "喵喵~~~~" << endl;
    }
    virtual void doWork()
    {
        cout << "抓老鼠" << endl;
    }

};

class Dog :public Animal
{
public:
    virtual void cry()
    {
        cout << "汪汪~~" << endl;
    }
    virtual void doWork()
    {
        cout << "看家" << endl;
    }
};

class Tree
{
public:
    Tree(int age)
    {
        this->age = age;
    }
    virtual void print()
    {
        cout << "我是大叔" << endl;
    }
    int age;
};


int main(void)
{
    Animal *animal = new Dog;
    //是c++中真正的 强制转换, 也是最危险的转换方式。
    Tree* tree = reinterpret_cast<Tree*>(animal); 
    if (tree != NULL)
    {
        cout << "转换成功" << endl;
        cout << tree->age << endl;
        tree->print();
    }
    else
    {
        cout << "转换失败" << endl;
    }
    return 0;
}

三、总结

程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。一般情况下,不建议进行类型转换。

ESP32学习笔记06-UART 的485 通讯模式 通信方式选择UART 控制器支持多种通信模式,使用函数 uart_set_mode() 可以选择模式。选择特定模式后,UART 驱动程序将处理已连接 UART 设备的相应行为。例如,主机开始向 Tx FIFO 缓冲区写入数据时,UART 驱动程序会自动置位 RTS 管脚(逻辑 1);最后一位数据传输完成后,驱动程序就会取消置位 RTS 管脚(逻辑 0)。要使用此模式,软件。 阅读详情

相关推荐

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 903

行为型模式-观察者模式

  随着交通信号灯的变化,汽车的行为也将随之而变化,一盏交通信号灯可以指挥多辆汽车。   观察者模式是用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。 观察者模式中的角色和职责 Subject(被观察者或目标,抽象主题):被观察的对象。当需要被观察的状态发生变化时.

bureau123的博客 236

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

[C++]使用C++实现监控文件是否被修改

软件开发过程中经常会用到配置文件,某些应用场景要求在软件运行时动态修改配置文件,此时就需要监控配置文件是否被修改,下面我们就来看看如何使用C++实现这一功能吧。软件开发过程中经常会用到配置文件,某些应用场景要求在软件运行时动态修改配置文件,此时就需要监控配置文件是否被修改,如果修改了,重新加载。这里config.txt和可执行文件同一目录,每次修改config.txt,就会打印File changed。

FL1768317420的博客 541

Moltbot 超详细安装使用教程(初学者版)

你在外面逛街,用微信/Telegram 发消息说"帮我查一下明天的天气"它立刻帮你查好并回复你说"帮我在电脑上新建一个文件夹叫'工作文档'"它真的帮你在电脑上创建了这就是 Moltbot ——一个能真正帮你干活的 AI 助手。API Key 就像是一把"钥匙",让 Moltbot 能够使用 AI 服务。

weixin_51040479的博客 2017

【Collibra 驱动 IPD 数据血缘治理】:三层图谱分层展示体系与全链路追踪的技术业务实践

(应用级/数据级/字段级)是理解复杂数据流动的核心手段。其价值不仅体现在可视化的直观性,更在于通过。技术保障血缘不可篡改性,进一步提升IPD数据治理的可靠性。,解决了跨层级血缘分析的性能与可用性矛盾。数据血缘图谱要素定义(字节跳动/腾讯云/信安标委)实现对IPD数据的精准追踪,而数据血缘图谱的。分层交互设计标准(智慧城市数据中台规范)Collibra技术文档(2024)字段级血缘的挑战与解决路径。自动优化血缘路径,并深化。字段级血缘技术实现方案。Collibra通过。图数据库性能优化原理。

百态·数智思维 | 聚焦大数据、量化与未来AI 1244

c++中四种cast转换

说一说c++中四种cast转换 参考回答: C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast 1、const_cast 用于将const变量转为非const 2、static_cast 用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知; 3、dynamic_cast 用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向

lin的博客 508

用SOEM库搞定汇川SV660N伺服电机:一个Linux C程序员的EtherCAT实战笔记

本文详细介绍了如何在Linux系统下使用SOEM库驱动汇川SV660N伺服电机,包括环境搭建、EtherCAT从站设备识别、PDO映射配置、状态机切换与运动控制等关键步骤。通过实战代码示例和常见问题排查指南,帮助开发者快速掌握工业自动化中的EtherCAT通信技术,实现对伺服电机的精准控制。

weixin_29185199的博客 424

C++变量类型转换

1:int转换为CString CString str; str.Format("As string: %d", int); 2:double转换为CString CString str; str.Format("As string: %g", double); 3:string转换为CString CString str std::string ss= "He...

weixin_33696822的博客 323

CVAT自动标注避坑指南:如何解决Nuclio工程创建失败和镜像拉取问题

本文是一份针对CVAT自动标注部署中常见问题的实战排障指南。文章深入剖析了Nuclio工程创建失败的根源,提供了网络配置、服务状态检查等系统性解决方案,并详细讲解了如何解决gcr.io等海外镜像拉取难题,帮助开发者顺利完成CVAT自动标注环境的搭建与部署。

weixin_29207533的博客 233

allegro 约束管理Constraint Manager(一)

介绍Cadence allegro 约束管理器CM的使用方法。

weixin_38975819的博客 8720

C++修炼:C++中的类型转换

本文系统介绍了C++中的类型转换机制,主要内容包括:1. C语言类型转换回顾,包括隐式和显式转换;2. C++新增的类型转换特性,如内置类型与自定义类型间的转换(通过构造函数和operator函数实现);3. C++四种显式强制类型转换运算符:static_cast(常规转换)、reinterpret_cast(低级别转换)、const_cast(const属性操作)和dynamic_cast(多态类型安全转换);4. RTTI(运行时类型信息)机制及其应用。

但凡的博客 1009

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2053

【C++干货铺】C++中的四种类型转换

本篇文章介绍了C++中的四种强制类型转换。

qq_55119554的博客 1613

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】C++中的类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast本文将向你详细的介绍他们的用途和使用方式。

weixin_45897952的博客 1125

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 浅谈C++中的泛型编程
下一篇: 使用PHP中的库函数file_get_contents时出现Unable to find the wrapper "https"错误解决
The_Web3_社区
博客等级 码龄10年 388粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值