C++语法|explicit关键字

文章目录

  • 1.C++的隐式对象转换问题
    • 举例
    • 产生的问题
  • 2.使用explicit解决上述问题
  • 总结

1.C++的隐式对象转换问题

在C++中,隐式对象转换(Implicit Object Conversion)指的是编译器在不需要程序员明确指示的情况下,自动将对象从一种类型转换为另一种类型的过程。这种转换通常发生在对象被传递给函数或者赋值给另一个对象时。隐式转换可以提高代码的可读性和简洁性,但也可能导致一些不易察觉的错误

举例

当一个类对象作为参数传递给函数时,编译器可能会使用该类的构造函数来创建一个临时对象,从而实现隐式转换

考虑一个图书馆管理系统的场景,其中我们有用于处理书籍元数据和用户操作的类。假设有一个类设计用来以整数形式处理用户ID,另一个类设计用来以字符串形式处理书籍的ISBN。

/*UserID类:
构造函数接受一个整数;
id()方法返回该类的id, id的标准格式比如12345
*/
class UserID {
public:UserID(int id) : id_(id) {}int id() const { return id_; }
private:int id_;
};
/*Book类别
构造函数接受一个格式化字符串
isbn()方法返回该类的isbn号, 典型的ISBN号:"123-456-789-X"
*/
class Book {
public:Book(const std::string& isbn) : isbn_(isbn) {}string isbn() const { return isbn_; }
private:string isbn_;
};void processUser(UserID uid) {cout << "Processing userID: " << uid.id() << endl;
}
void displayBook(Book book) {cout << "DisplayingISBN: " << book.isbn() << endl;
}

我们现在使用我们刚才定义的两个函数看看:

int main() {processUser(12345);  // Implicitly converts integer to UserIDdisplayBook("123-456-789-X");  // Implicitly converts C-string to Book
}

在这里就已经发生了隐式对象转换,我们的processUser函数和displayBook函数应该分别接受一个UserID类和一个Book类。但是编译器为我们自动得讲int类型转换为了UserID类;将C风格字符串类型转换为了Book类别。

好像还挺不错的,清晰易懂。

产生的问题

一切使用得当,这些转换将按预期工作,但如果由于隐式转换的特性,类型被混合使用或使用不当,问题就会出现:

int main() {displayBook(78910);  // Mistakenly passes an integer
}

在上面的代码中,由于 Book 构造函数接受一个 std::string 类型的参数,整数 78910 被隐式地转换为字符串导致创建了一个 ISBN 为 “78910” 的 Book 对象。这是一个逻辑错误,因为 ISBN 号码并不是简单的整数,它们应该遵循特定的字符串格式。构造函数没有验证输入实际上是否代表一个有效的 ISBN,这可能导致系统数据完整性的潜在错误。

2.使用explicit解决上述问题

class UserID {
public:explicit UserID(int id) : id_(id) {}int id() const { return id_; }
};class Book {
public:explicit Book(const std::string& isbn) : isbn_(isbn) {}std::string isbn() const { return isbn_; }
};

将构造函数标记为 explicit 后,之前的隐式转换将不再被允许

int main() {processUser(12345);  // Error: no viable conversion from 'int' to 'UserID'编译器将为我们报错displayBook("123-456-789-X");  // Error: no viable conversion from 'const char*' to 'Book'编译器将为我们报错// Correct usage requires explicit constructionprocessUser(UserID(12345));displayBook(Book("123-456-789-X"));
}

总结

explicit用于类的构造函数,所以编译器不能听我们隐式得讲任何类型转换为我们的类类型。

通过使用 explicit 关键字,你强制构造函数只被有意识地调用,而不是被编译器来随意使用。从而降低了错误的风险,并使代码的意图更加清晰。这种做法增强了你的应用程序的健壮性和正确性,特别是在类型安全性至关重要的复杂系统中。

我们后续还会讨论它的具体使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware配置Kali linux + 物理机连接Xshell

VMware 配置 kali linux 首先需要先安装VMware Workstation 我是在Windows 安装的 VMware Workstation Pro 17 虚拟化&#xff0c;产品密钥。。这里不做多说了 下载kali linux 这里我下载的是kali-linux-2024.1 Note&#xff1a;这里选Virtual Machines&#xff0c;建议不要…

景源畅信:抖音小店的商品怎么同步到橱窗?

在数字营销的海洋中&#xff0c;抖音小店与橱窗的同步操作无疑是商家们关注的焦点。这不仅能增加商品的曝光度&#xff0c;还能提高交易的可能性。那么&#xff0c;如何将抖音小店的商品同步到橱窗呢? 一、核心步骤解析 要实现商品从抖音小店同步到橱窗&#xff0c;你需要确保…

【Linux 网络】网络编程套接字 -- 详解

⚪ 预备知识 1、理解源 IP 地址和目的 IP 地址 举例理解&#xff1a;&#xff08;唐僧西天取经&#xff09; 在 IP 数据包头部中 有两个 IP 地址&#xff0c; 分别叫做源 IP 地址 和目的 IP 地址。 如果我们的台式机或者笔记本没有 IP 地址就无法上网&#xff0c;而因为…

Unity引擎是什么?有哪些优点

大家好&#xff0c;我是咕噜土豆&#xff0c;很高兴又和大家见面了。今天我们一起来了解一下Unity引擎和它有哪些优点。 首先带大家了解什么是Unity引擎 Unity引擎是一款由Unity Technologies开发的跨平台游戏开发引擎&#xff0c;广泛用于创建2D和3D游戏以及其他交互式内容&…

C++动态内存区域划分、new、delete关键字

目录 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 二、new关键字 1、内置类型的new/delete使用方法&#xff1a; 2、new和delete的本质 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 因为不同数据有不同的存储需求&#xff0…

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问(1)

前言 在程序开发尤其是网页应用开发中&#xff0c;数据访问是必不可少的。通过前面的基本案例我们完成了一个简单的SpringBoot Web应用并对自动配置原理有了一定了解&#xff0c;本节在上述案例基础上&#xff0c;继续编写数据访问案例&#xff0c;将通过SpringBoot中数据访问…

音视频开发6 音视频录制原理和播放原理

音视频录制原理 音视频播放原理

VO、PO、DTO的区别

VO&#xff1a;值对象&#xff0c;用于视图层&#xff0c;它的作用是把某个指定页面&#xff08;或组件&#xff09;的所有数据封装起来。 PO&#xff1a;持久化对象&#xff0c;它跟持久层&#xff08;通常是关系型数据库&#xff09;的数据结构形成一一对应的映射关系&#…

# 电脑突然连接不上网络了,怎么办?

电脑突然连接不上网络了&#xff0c;怎么办&#xff1f; 一、原因分析&#xff1a; 1、IP 地址冲突 2、DNS 解析出现问题。 3、电脑网络设置是否打开了【移动热点】或【飞行模式】。 4、【WLAN AutoConfig】服务是否打开。 5、无线网卡驱动损坏。 6、检查 WIFI 开关是否…

java线程池源码解析:ThreadPoolExecutor源码,execute方法、addWorker方法解析

1. 概述 线程池 的作用不用太说了&#xff0c;线程池会按照一定的规则&#xff0c;创建和维护一定数量的线程。这些线程可以被循环利用&#xff0c;来处理用户提交的任务。对比不同线程池的使用方式&#xff0c;节省了频繁的创建和销毁线程带来的性能开销。 2. 概念理解 2…

从FasterTransformer源码解读开始了解大模型(2.0)代码通读01

从FasterTransformer源码解读开始了解大模型&#xff08;2.0&#xff09;代码解读01-看看头文件 写在前面的话 本篇的内容直接开始我们的代码通读&#xff0c;整个通读可能需要好几篇文章来将一整个gpt的代码结构给讲清楚。目前的计划是先从整体model层次开始讲&#xff0c;将…

Java8 Stream API在集合上执行复杂的数据处理查询

Java 8 引入的 Stream API 是一个高级工具&#xff0c;用于在集合上执行复杂的数据处理查询。Stream API 通过提供一系列的中间操作和最终操作&#xff0c;支持声明式处理&#xff08;类似于SQL声明式语句&#xff09;并且可以轻松使用多核架构。 创建Stream流 创建Stream 流…

HTML+VUE3组合式+ELEMENT的容器模板示例(含侧栏导航,表格,...)

一个简单的在html中使用Vue3及Element-plus vue-icons的整合示例&#xff1a; 一、示例截图 二、文件代码 直接复制到html文件在浏览器打开即可预览 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&g…

CCleaner系统优化与隐私保护工具,中文绿色便携版 v6.23.11010

01 软件介绍 CCleaner 是一款高级的系统优化工具&#xff0c;其设计宗旨在于彻底清理 Windows 操作系统中积累的无用文件和冗余的注册表项。此举旨在显著提升计算机的运行效率并回收磁盘空间。该软件拥有高效的能力&#xff0c;可以清除包括临时文件、浏览器缓存及其历史记录在…

哪些设计模式,你使用过哪些设计模式

Java框架中运用了多种设计模式&#xff0c;以下是一些具体的例子以及它们在框架中的应用&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。例如&#xff0c;Java中的Runtime类使用了单例模式…

08 - hive的集合函数、高级聚合函数、炸裂函数以及窗口函数

目录 1、集合函数 1.1、size&#xff1a;集合中元素的个数 1.2、map&#xff1a;创建map集合 1.3、map_keys&#xff1a; 返回map中的key 1.4、map_values: 返回map中的value 1.5、array 声明array集合 1.6、array_contains: 判断array中是否包含某个元素 1.7、sort_a…

python中多态的概念及简单样例

目录 1、多态概念及关键要素&#xff1a; 2、代码样例&#xff1a; 1、多态概念及关键要素&#xff1a; 多态是面向对象编程中一个重要的概念&#xff0c;它允许不同类的对象对同一消息做出不同的响应。简单来说&#xff0c;多态性是指相同的方法调用可以在不同的对象上产生不…

UIKit之UIButton

功能需求&#xff1a; 点击按钮切换按钮的文字和背景图片&#xff0c;同时点击上下左右可以移动图片位置&#xff0c;点击加或减可以放大或缩小图片。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xf…

TypeScript常见面试题第七节

题目三十一:TypeScript 中声明合并的工作原理? 一、讲解视频 TS面试题三十一:TypeScript 中声明合并的工作原理? 二、题目解析 本题目考察对于 ts 中声明合并知识的了解,“声明合并”是指编译器将针对同一个名字的两个独立声明合并为单一声明。 合并后的声明同时拥有原先…

每日资讯——OpenAI与谷歌相争,火药味甚浓

OpenAI与苹果达成合作&#xff0c;ChatGPT或集成至IOS18 AI语音助手存在”幻觉“问题&#xff0c;或将集成至ChatGPT免费版 整合音频转录、文本转语音等功能的软件。奥特曼的终极目标是开发类似电影《她》中&#xff0c;可高度响应的虚拟助手&#xff0c;提升苹果Siri等现有语…