当前位置: 首页 > article >正文

C/C++---隐式显式转换

1. 隐式转换(Implicit Conversion)

隐式转换是编译器主动进行的类型转换,无需程序员额外编写代码。这种转换一般发生在赋值、函数调用、表达式计算等场景中。

1.1 隐式转换的常见场景
  • 数值类型转换:从较小的类型转换为较大的类型(如int转为double)。
    int x = 10;
    double y = x; // int隐式转换为double
    
  • 指针转换:从派生类指针转换为基类指针。
    class Base {};
    class Derived : public Base {};
    Derived* d = new Derived();
    Base* b = d; // 派生类指针隐式转换为基类指针
    
  • 布尔转换:把数值类型或指针类型转换为bool类型。
    int x = 0;
    if (x) { /* ... */ } // int隐式转换为bool,0转为false,非0转为true
    
  • 用户定义转换:通过单参数构造函数或者类型转换运算符实现。
    class String {
    public:String(const char* str); // 单参数构造函数,可用于隐式转换operator const char*() const; // 类型转换运算符
    };
    String s = "hello"; // 隐式调用构造函数
    const char* c = s;  // 隐式调用类型转换运算符
    
1.2 隐式转换存在的问题

隐式转换可能会使代码的可读性降低,还可能引发意想不到的错误。

class Complex {
public:Complex(double real, double imag = 0.0);
};void func(const Complex& c);func(3.14); // 隐式转换,调用Complex(3.14, 0.0)

2. 显式转换(Explicit Conversion)

显式转换需要程序员明确地指定类型转换,主要有以下几种方式。

2.1 C风格强制转换
int x = 10;
double y = (double)x; // C风格强制转换
2.2 函数风格转换
int x = 10;
double y = double(x); // 函数风格转换
2.3 C++新式转换运算符

C++提供了四种类型转换运算符,分别用于不同的场景。

  • static_cast:用于基本类型转换、父子类指针/引用转换等。
    double d = 3.14;
    int i = static_cast<int>(d); // 基本类型转换
    Derived* d = new Derived();
    Base* b = static_cast<Base*>(d); // 子类到父类的指针转换
    
  • dynamic_cast:主要用于运行时的类型安全转换,特别是在多态类型之间进行转换。
    Base* b = new Derived();
    Derived* d = dynamic_cast<Derived*>(b); // 安全的向下转换
    
  • const_cast:用于移除constvolatile限定符。
    const int x = 10;
    int* p = const_cast<int*>(&x); // 移除const限定符
    
  • reinterpret_cast:用于进行低级别的指针转换,这种转换很不安全。
    int x = 10;
    char* p = reinterpret_cast<char*>(&x); // 指针类型重新解释
    

3. explicit关键字

explicit 关键字主要用于修饰单参数构造函数或者转换运算符,其作用是禁止隐式转换,只允许显式转换。

3.1 修饰单参数构造函数
class Complex {
public:explicit Complex(double real, double imag = 0.0);
};void func(const Complex& c);func(3.14); // 错误,禁止隐式转换
func(Complex(3.14)); // 正确,显式转换
func(static_cast<Complex>(3.14)); // 正确,显式转换
3.2 修饰转换运算符(C++11及以后)
class String {
public:explicit operator bool() const; // 显式类型转换运算符
};String s;
if (s) { /* ... */ } // 正确,bool语境下允许隐式转换
bool b = s; // 错误,禁止隐式转换
bool b = static_cast<bool>(s); // 正确,显式转换
3.3 多参数构造函数与explicit

在C++11及以后的版本中,多参数构造函数也能使用explicit关键字。

class Range {
public:explicit Range(int min, int max);
};void func(const Range& r);func({1, 10}); // 错误,禁止隐式转换
func(Range(1, 10)); // 正确,显式转换

4. 最佳实践

  • 对于单参数构造函数,除非有特别的原因,否则建议加上explicit关键字,防止出现意外的隐式转换。
  • 优先使用C++新式转换运算符,避免使用C风格强制转换,因为新式转换运算符更加安全,而且错误信息也更明确。
  • 在设计类型转换运算符时,要谨慎考虑是否允许隐式转换。如果转换可能会让使用者产生误解,那么就应该使用explicit关键字。

5. 总结

概念特点示例
隐式转换编译器自动进行,可能会带来风险int转为double,单参数构造函数转换
显式转换需要程序员明确指定,更加安全static_castdynamic_cast
explicit禁止隐式转换,提高代码安全性explicit Complex(double)

通过合理运用explicit关键字和显式转换,可以有效提升代码的可读性和安全性,减少潜在的错误。

也许我不会变得「著名」或「伟大」,可我要继续冒险,继续改变,开阔眼界。 —弗吉尼亚·伍尔夫

相关文章:

C/C++---隐式显式转换

1. 隐式转换&#xff08;Implicit Conversion&#xff09; 隐式转换是编译器主动进行的类型转换&#xff0c;无需程序员额外编写代码。这种转换一般发生在赋值、函数调用、表达式计算等场景中。 1.1 隐式转换的常见场景 数值类型转换&#xff1a;从较小的类型转换为较大的类…...

巡礼中国西极·跨越昆仑天山 | 北斗卫星徽章护航昆仑科考

神秘深邃&#xff0c;遗世独立。帕米尔高原&#xff0c;横亘于中亚东南部&#xff0c;我国的最西端&#xff0c;面积约10万平方千米&#xff0c;平均海拔4500米以上&#xff0c;古代丝绸之路在此经过。昆盖山&#xff0c;一座掩藏在帕米尔高原褶皱深处、鲜为人知的山脉&#xf…...

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…...

LangChain4j第三篇: RAG的简单应用与实践

引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…...

机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴

机器学习第二十六讲&#xff1a;官方示例 → 跟着菜谱学做经典菜肴 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 以跟着菜谱学…...

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法

howler.js 是一个功能强大且易于使用的 JavaScript 音频库&#xff0c;它提供了跨浏览器的音频播放功能&#xff0c;支持多种音频格式&#xff0c;并且具有丰富的 API&#xff0c;可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…...

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…...

如何使用patch-package给npm包打补丁

一、背景 在移动应用开发中,轮播是一种很常见的效果,我们项目采用的是RN跨平台技术,RN的轮播我们直接使用的是第三方插件:react-native-snap-carousel。不过,当我们在项目中使用的时候却发现Android和iOS的表现不一致:https://stackoverflow.com/questions/60711611/rea…...

maxkey单点登录系统

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址&#xff1a; Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara &#x1f5dd;️MaxK…...

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内 前言&#xff1a;最近遇到一个需求&#xff0c;我有15个文件夹(可能包含子文件夹) &#xff0c;目前我有一批文件名称&#xff0c;需要在这15个文件夹中查找出来&#xff0c;并拷贝到一个新的文件夹…...

Notepad++ 下载与安装教程(小白专属)

文章目录 Notepad下载渠道的专业选择1. 官方网站下载&#xff08;海外用户或网络条件优越者首选&#xff09;2. 国内优化下载地址&#xff08;国内用户高效选择&#xff09; Notepad精细化安装流程解析总结与后续建议 在当前的开发与文本处理工作中&#xff0c;Notepad无疑是一…...

Spring Cloud Gateway 微服务网关实战指南

上篇文章简单介绍了SpringCloud系列OpenFeign的基本用法以及Demo搭建&#xff08;Spring Cloud实战&#xff1a;OpenFeign远程调用与服务治理-CSDN博客&#xff09;&#xff0c;今天继续讲解下SpringCloud Gateway实战指南&#xff01;在分享之前继续回顾下本次SpringCloud的专…...

微服务架构实战:Eureka服务注册发现与Ribbon负载均衡详解

微服务架构实战&#xff1a;Eureka服务注册发现与Ribbon负载均衡详解 一 . 服务调用出现的问题二 . EureKa 的作用三 . 服务注册3.1 搭建 EureKaServer① 创建项目 , 引入 spring-cloud-starter-netflix-eureka-server 的依赖② 编写启动类 , 添加 EnableEurekaServer 注解③ 添…...

采用多维计算策略(分子动力学模拟+机器学习),显著提升 α-半乳糖苷酶热稳定性

字数 978&#xff0c;阅读大约需 5 分钟 在工业应用领域&#xff0c;α-半乳糖苷酶在食品加工、动物营养及医疗等方面发挥着重要作用。然而&#xff0c;微生物来源的该酶往往存在热稳定性不足的问题&#xff0c;限制了其在工业场景中的高效应用。近日&#xff0c;来自江南大学的…...

【java】小练习--零钱通

文章目录 前言一、项目开发流程说明二、功能实现2.1 菜单2.2 零钱通明细2.3 零钱通收益2.4 零钱通消费2.5 零钱通退出确认2.6 零钱通金额校验2.7 完整代码 三、零钱通OOP版 前言 本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记&#xff0c;主要…...

旅游信息检索

旅游信息检索 旅游信息检索是系统中实现数据获取和处理的关键环节&#xff0c;负责根据用户输入的目的地城市和出游天数&#xff0c;动态获取并生成高质量的旅游数据。 模块的工作流程分为以下几个阶段&#xff1a;首先&#xff0c;对用户输入的信息进行标准化处理&#xff0…...

贝叶斯理论

一、贝叶斯理论的核心思想 贝叶斯理论&#xff08;Bayesian Theory&#xff09;是一种基于条件概率的统计推断方法&#xff0c;其核心是通过先验知识和新观测数据的结合&#xff0c;动态更新对事件发生概率的估计。它体现了“用数据修正信念”的思想&#xff0c;广泛应用于机器…...

Docker-mongodb

拉取 MongoDB 镜像: docker pull mongo 创建容器并设置用户&#xff1a; 要挂载本地数据目录&#xff0c;请替换此路径: /Users/Allen/Env/AllenDocker/mongodb/data/db docker run -d --name local-mongodb \-e MONGO_INITDB_ROOT_USERNAMEadmin \-e MONGO_INITDB_ROOT_PA…...

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》学习心得

一、引言 在当今数字化营销浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑着市场格局。GenAI 既是一场充满机遇的变革,也是一场潜在风险的挑战。一方面,绝大多数 B2C 营销领导者对 GenAI 赋能营销抱有极高期待,他们看到了 GenAI 在提升时间与成本效率方面的巨大潜…...

[ARM][汇编] 02.ARM 汇编常用简单指令

目录 1.数据传输指令 MRS - Move from Status Register 指令用途 指令语法 代码示例 读取 CPSR 到通用寄存器 在异常处理程序中读取 SPSR 使用场景 MSR - Move to Status Register 指令语法 使用场景 示例代码 改变处理器模式为管理模式 设置条件标志位 异常处理…...

达梦数据库-学习-22-库级物理备份恢复(超详细版)

目录 一、环境信息 二、说点什么 三、概念 1、备份恢复 2、重做日志 3、归档日志 4、LSN 5、检查点 四、语法 1、BACKUP DATABASE 2、DMRMAN RESTORE DATABASE 3、DMRMAN RECOVER DATABASE 4、DMRMAN UPDATE DB_MAGIC 五、实验 1、开归档 &#xff08;1&#xf…...

python网络爬虫的基本使用

各位帅哥美女点点关注&#xff0c;有关注才有动力啊 网络爬虫 引言 我们平时都说Python爬虫&#xff0c;其实这里可能有个误解&#xff0c;爬虫并不是Python独有的&#xff0c;可以做爬虫的语言有很多例如&#xff1a;PHP、JAVA、C#、C、Python。 为什么Python的爬虫技术会…...

AI Agent开发第74课-解构AI伪需求的魔幻现实主义

开篇 🚀在之前的系列中我们狂炫了AI Agent的各种高端操作(向量数据库联动、多模态感知、动态工作流等…),仿佛每个程序员都能用LLM魔法点石成金✨。 但今天咱们要泼一盆透心凉的冷水——当企业把AI当成万能胶水强行粘合所有需求时,连电风扇都能被玩出量子纠缠的魔幻现实…...

【卫星通信】通信卫星链路预算计算及其在3GPP NTN中的应用

引言 卫星通信是现代信息传播的重要手段&#xff0c;广泛应用于电信、广播、气象监测、导航等领域。卫星链路预算计算是设计和优化卫星通信系统的重要步骤&#xff0c;它帮助工程师评估信号在传输过程中的衰减和增益&#xff0c;从而确保系统在预定条件下可靠地工作。 1. 链路…...

HTTP请求方法:GET与POST的使用场景解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 HTTP协议定义了多种请求方法&#xff0c;其中GET和POST是最常用的两种。它们在Web开发中承担着不同的角色&#xff0c;理解其核心差异和使用场景是构建高效、…...

第十五章:数据治理之数据目录:摸清家底,建立三大数据目录

在上一篇随想篇中&#xff0c;介绍了数据资源资产化的过程&#xff0c;理解了数据资源、数据资产的区别。这些对于本章的介绍会有帮助&#xff0c;如果仍有疑问可以看上一篇【数据资源到数据资产的华丽转身 ——从“沉睡的石油”到“流动的黄金”】。 说到本章要介绍的数据目录…...

c++命名空间的作用及命名改编

c命名空间的作用及命名改编 命名空间 namespace的作用&#xff1a; std::命名空间&#xff0c;命名空间&#xff08;namespace&#xff09;是 C 中用于解决标识符命名冲突问题的机制。在大型程序开发中&#xff0c;不同模块可能会使用相同名称的变量、函数或类等标识符&…...

Go核心特性与并发编程

Go核心特性与并发编程 1. 结构体与方法&#xff08;扩展&#xff09; 高级结构体特性 // 嵌套结构体与匿名字段 type Employee struct {Person // 匿名嵌入Department stringsalary float64 // 私有字段 }// 构造函数模式 func NewPerson(name string, age int) *Pe…...

echarts实现项目进度甘特图

描述 echarts并无甘特图配置项&#xff0c;我们可以使用柱状图模拟&#xff0c;具体配置项如下&#xff0c;可以在echarts直接运行 var option {backgroundColor: "#fff",legend: {data: ["计划时间","实际时间"],align: "right",…...

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中

Flutter 中 build 方法为何写在 StatefulWidget 的 State 类中 在 Flutter 中&#xff0c;build 方法被设计在 StatefulWidget 的 State 类中而非 StatefulWidget 类本身&#xff0c;这种设计基于几个重要的架构原则和实际考量&#xff1a; 1. 核心设计原因 1.1 生命周期管理…...