default、delete 和 explicit

在 C++11 中,增加了几个新的关键字和特性,它们用来更精确地控制类的基本函数(如构造函数、拷贝构造函数、赋值运算符等)。其中,defaultdeleteexplicit 都是用于这些基本函数的关键字,目的是让程序员在特定的情况下更加灵活地控制类的行为。

1. default:默认函数

概念

default 关键字用于告诉编译器自动生成某个函数的默认实现。可以用来显式地声明编译器默认的构造函数、拷贝构造函数、赋值运算符和析构函数等。

在某些情况下,如果你没有显式地定义某些基本函数(如构造函数、拷贝构造函数等),编译器会自动生成它们。但是,有时你可能需要明确指定某些函数应该由编译器自动生成,而不是手动实现。default 关键字就是为此设计的。

用法
  • 默认构造函数:如果你没有显式定义构造函数,编译器会自动生成一个默认构造函数。如果你希望显式地声明一个默认构造函数,可以使用 default
  • 拷贝构造函数、赋值运算符:如果你没有定义这些函数,编译器会自动生成它们。如果你不想使用编译器生成的实现,可以手动删除它们;如果你希望使用默认实现,可以显式地使用 default
示例
class MyClass {
public:MyClass() = default;  // 显式指定使用编译器自动生成的默认构造函数MyClass(const MyClass&) = default;  // 显式指定使用编译器自动生成的拷贝构造函数MyClass& operator=(const MyClass&) = default;  // 显式指定使用编译器自动生成的赋值运算符~MyClass() = default;  // 显式指定使用编译器自动生成的析构函数
};int main() {MyClass obj1;  // 使用默认构造函数MyClass obj2 = obj1;  // 使用默认的拷贝构造函数obj1 = obj2;  // 使用默认的赋值运算符
}
理解
  • 如果没有 default,编译器会根据需要自动生成这些函数。但是,当你想显式控制某些函数的行为时,可以使用 default。比如,某些类型的成员变量可能需要特定的初始化,或者拷贝操作需要特定的处理。
  • 使用 default 可以避免编写冗余的代码,也让程序员明确表达出他们希望让编译器自动生成这些函数。

2. delete:删除函数

概念

delete 关键字用于显式地告诉编译器某个函数是不可用的,也就是禁止调用某个函数。常用于禁止拷贝构造函数、赋值运算符等不希望被调用的函数。通常是为了防止对象的拷贝或赋值,或阻止某些操作。

用法
  • 禁止拷贝构造函数或赋值运算符:可以使用 delete 来禁止编译器自动生成拷贝构造函数或赋值运算符。这在有些场景中是必需的,比如实现单例模式时,防止对象被复制。
示例
class NoCopy {
public:NoCopy() = default;// 禁止拷贝构造函数和赋值运算符NoCopy(const NoCopy&) = delete;NoCopy& operator=(const NoCopy&) = delete;
};int main() {NoCopy obj1;// NoCopy obj2 = obj1;  // 编译错误:拷贝构造函数被删除// obj1 = obj2;  // 编译错误:赋值运算符被删除
}
理解
  • NoCopy 类中,我们使用 delete 来显式地禁止了拷贝构造函数和赋值运算符。这使得 NoCopy 类型的对象不能被复制或赋值。这是常见的场景,比如 单例模式 或者 资源管理 类(例如 std::unique_ptr)中,用来确保对象的唯一性和防止意外复制。
  • delete 使得编译器直接报错,而不只是生成一个空实现,避免了不小心使用了被禁用的函数。

3. explicit:显式构造函数

概念

explicit 关键字用于修饰构造函数,防止它在不明确的情况下进行隐式类型转换。没有 explicit 的构造函数可以用来进行隐式类型转换,而带有 explicit 的构造函数不能用于隐式转换。它是用来避免不希望的隐式类型转换或“魔法”行为。

用法
  • 防止隐式类型转换:如果你有一个构造函数,并且不希望它在某些情况下被自动调用(例如进行隐式类型转换),可以使用 explicit 来禁止隐式转换。
示例
class MyClass {
public:explicit MyClass(int x) { // 显式构造函数std::cout << "MyClass constructed with " << x << std::endl;}
};int main() {MyClass obj1(10);  // 正常:直接传递参数// MyClass obj2 = 10;  // 编译错误:没有隐式构造函数
}
理解
  • 在没有 explicit 的情况下,MyClass(10) 可以隐式地用作 MyClass 对象的构造,例如 MyClass obj = 10; 这样的代码会尝试隐式地用 10 来构造一个 MyClass 对象。
  • 使用 explicit 后,构造函数就不能进行隐式类型转换了。这样,如果你试图将 10 隐式地转换为 MyClass 对象,编译器会报错。这有助于避免因隐式转换导致的意外行为或错误。
场景
  • 防止隐式转换:在某些情况下,允许编译器进行隐式类型转换可能会导致不希望的结果,使用 explicit 可以避免这种情况。
  • 增加代码的可读性和安全性:当你希望构造函数只通过显式调用来创建对象时,使用 explicit 可以确保构造函数不被自动调用。

总结

  • default:显式请求编译器生成某个函数的默认实现。用在构造函数、拷贝构造函数、赋值运算符、析构函数等地方,用来避免手动编写一些常见的函数实现。
  • delete:显式禁止某个函数的使用,如拷贝构造函数、赋值运算符等,用于防止某些操作(如拷贝、赋值)在某些情况下被执行。
  • explicit:防止构造函数进行隐式类型转换,要求构造函数必须显式地调用。避免不期望的隐式转换导致程序错误。

通过正确地使用这三个关键字,可以在 C++11 中编写更加安全、清晰且易于维护的代码,避免不必要的自动化行为和复杂的隐式转换。

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

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

相关文章

LeetCode - 初级算法 数组(只出现一次的数字)

只出现一次的数字 这篇文章讨论如何找到一个数组中只出现一次的数字,确保算法的时间复杂度为线性,且只使用常量额外空间。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两…

【谷歌开发者月刊】十二月精彩资讯回顾,探索科技新可能

我们在今年的尾声中回顾本月精彩&#xff0c;开发者们借助创新技术为用户打造温暖的应用体验&#xff0c;展现技术与实用的结合。欢迎您查阅本期月刊&#xff0c;掌握最新动态。 本月看点 精彩看点多多&#xff0c;请上下滑动阅览 01DevFest 北京站和上海站圆满举办&#xff0c…

LinuxC高级day4

作业: 1.思维导图 2.终端输入一个C源文件名(.c结尾)判断文件是否有内容&#xff0c;如果没有内容删除文件&#xff0c;如果有内容编译并执行改文件。 3.终端输入两个文件名&#xff0c;判断哪个文件的时间戳更新

数据中台与数据治理服务方案[50页PPT]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心&#xff0c;通过整合各部门业务系统数据&#xff0c;进行建模与加工&#xff0c;以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题&#xff0c;确保数据…

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

时间序列预测算法---LSTM

文章目录 一、前言1.1、深度学习时间序列一般是几维数据&#xff1f;每个维度的名字是什么&#xff1f;通常代表什么含义&#xff1f;1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路&#xff1f;1.4、RNN存在哪些问题?…

LinuxC高级day2

1.在家目录下创建目录文件&#xff0c;dir a.dir下创建dir1和dir2 b.把当前目录下的所有文件拷贝到dir1中&#xff0c; c.把当前目录下的所有脚本文件拷贝到dir2中 d.把dir2打包并压缩为dir2.tar.xz e.再把dir2.tar.xz移动到dir1中 f.解压dir1中的压缩包 g.使用tree工具&#x…

14. 日常算法

1. 面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 class Solution { public:ListNo…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中&#xff0c;您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的&#xff0c;这意味着在系统重启后这些配置会丢失。为了将这些配置持久化&#xff0c;您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由&#xff0c;您可以将这些配…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器 1.基本介绍 1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门 1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径 1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器 1.执…

Mac电脑python多版本环境安装与切换

我当前是python3.9.6环境&#xff0c;需要使用3.9.8环境&#xff0c;通过brew安装3.9.8版本&#xff0c;然后通过pyenv切换环境 步骤 1: 安装 pyenv brew install pyenv brew install pyenv-virtualenv 步骤 2: 安装 Python 3.9.8&#xff08;使用 pyenv 安装指定版本的 Pyth…

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;采集原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习

1.思维导图 2练习&#xff1a; 1.尝试将下列指令放到脚本中运行 在家目录下创建目录文件dir1&#xff0c;把/etc/passwd拷贝到dir1中&#xff0c;把/etc/group拷贝到dir1中并重命名为grp.txt&#xff0c;使用tree指令&#xff0c;显示dir1目录的文件树&#xff0c;把dir1&am…

win11 vs2022 opencv 4.10 camshift示例程序运行

记录win11 vs2022 opencv 4.10下 camshift等示例程序的单步debug启动方式&#xff0c;方便了解源码。 debug版本编译通过&#xff0c;但运行时报出大量日志信息(部分dll加载FAILED后会自动找兼容dll)。但也能继续运行&#xff0c;效果如下 release版本可以直接运行&#xff0…

赛博周刊·2024年度工具精选(图片资源类)

1、EmojiSpark emoji表情包查找工具。 2、fluentui-emoji 微软开源的Fluent Emoji表情包。 3、开源Emoji库 一个开源的emoji库&#xff0c;目前拥有4000个emoji表情。 4、中国表情包大合集博物馆 一个专门收集中国表情包的项目&#xff0c;已收录5712张表情包&#xff0c;并…

通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤

1、什么是Ceph Ceph是一种开源、分布式存储系统&#xff0c;旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的&#xff0c;使得用户可以在无需特定硬件支持的前提下&#xff0c;通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…

JVM对象创建过程

1 类加载检查 jvm通过new指令开始创建对象jvm执行new指令时&#xff0c;首先通过指令参数从常量池中取到需要创建的类名检查该类是否被加载&#xff0c;解析&#xff0c;和初始化过如果没有&#xff0c;则执行类的加载过程new指令对应到java语言具体的操作为 new 关键字创建对象…

逆向生成原理

逆向工程原理 前言逆向工程的原理1.Freemarker模板引擎2.逆向工程的原理 前言 在我们实际开发过程中&#xff0c;开发流程大体可以分为需求分析、数据库字段设计、然后再开始编码&#xff0c;然后就开始创建我们实体类、controller、service、serviceImpl、mapper&#xff0c;…

【Unity】 HTFramework框架(五十七)通过Tag、Layer批量搜索物体

更新日期&#xff1a;2024年12月30日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 问题再现通过Tag搜索物体&#xff08;SearchByTag&#xff09;打开SearchByTag窗口搜索标记指定Tag的所有物体批量修改Tag搜索Undefined状态的所有物体 …