c++关键字: =delete和=default

=delete

概述 

=delete关键字是c++11新增的关键字,主要用于的场景是:当我们不希望类中的函数被类对象在外部调用的时候,我们就可以使用这个关键字。

其实,之前我们实现这种功能是将这些函数放在private修饰符下,但是这种方法是依靠语法特性来实现的,有些地方可能并不合适。


举个例子:   使用private虽然在类外不能使用这些函数了,但是在类的内部还是可以使用的,但是我们目前的要求是在任何地方都不能使用这些函数,那么这时候就得使用=delete关键字了。(因为用来它之后就相当于删除了,自然哪里也用不了了)

疑问:  那我们不用直接将这些函数删除不就好了,为什么多次一举呢?  

对于普通的函数,我们直接删除了自然时最好的,也可以减少歧义。

但是对于类的构造函数呢? 即使我们删除了,编译器也会自己给我们创建一个,这样即使我们删除掉,最起码在类内部还时可以使用的,所以这时候我们就得使用=delete关键字了。

使用=delete修饰类的构造函数之后,编译器就不会自动提供了,而且编译器依然会认为它们被删除了无法使用。

1. 此关键字用于构造函数 

对于构造函数,无论隐式的(就是编译器自己提供的)还是显示的(我们自己写的),在创建实例对象的时候,编译器都会默认去调用这些函数。但是有些时候,我们并不希望外界使用我们这些函数,那么就可以使用=delete关键字修饰,这样就相当于删除了对应的构造函数

代码例子:   

c++中有四种构造函数: 默认构造,有参构造,拷贝构造,赋值构造(=运算符重载)

#include <iostream>
#include <stdlib.h>using namespace std;class A {
public:A() = delete;A(const A& a) = delete;A(int a) = delete;A& operator=(const A& a) = delete;
};int main(void) {A a;  // 错误:  无法引用 "A" 的默认构造函数 -- 它是已删除的函数system("pause");return 0;
}

上面的代码,我们对类A中的所以构造函数都使用了=delete关键字。我们在main函数中创建对象a,会报错,因为创建对象会调用默认构造函数,但是我们使用=delete关键字修饰了默认构造函数,就相当于它被删除了,会报错。(其它的构造函数也一样,可以自己尝试)

一般情况下,我们是不会将所有的构造函数都用=delete(除非你这个类不常见对象),否则,建议只是根据需要将对应的构造函数=delete即可。

比如,将拷贝构造函数和复制构造函数用哪个delete修饰,不允许对类对象进行拷贝了,但是可以使用默认构造函数创建对象。(当然根据具体需要来选择)

2. 此关键字用于普通成员函数 

其实用于普通成员函数,也是一样的道理,编译器会认为这个函数删除了,但是成员函数和构造函数不一样,我们为什么不直接将其删除了,反正也不用了,何必多此一举。

当然,有一种情况下也是可以使用的   --  避免传参时进行形式转换。

一般情况,参数传递的时候,编译器都会进行隐式转换比如:

#include <iostream>
#include <stdlib.h>using namespace std;class A {
public:void func(int a) {printf("%d\n", a);}
};int main(void) {A a; a.func(1.2);   // 打印结果为1system("pause");return 0;
}

上面,我们给函数func传入一个double的值1.2,但是func的参数类型为int型,所以传入之后进行了隐式转换,将double的1.2转化为了int的1。

 下面代码就可以避免这种隐式转换

#include <iostream>
#include <stdlib.h>using namespace std;class A {
public:void func(int a) {printf("%d\n", a);}void func(double a) = delete;
};int main(void) {A a; a.func(1.2);   // 出错system("pause");return 0;
}

其实我们使用函数重载就可以避免,也就是我们在传入double的值调用的是形参为double的函数,这样就避免了。

但是,如果我们不希望外界使用形参为double的函数,还要避免隐式转换,就可以使用上面这种方式,我们直接传入double的值,就不会隐式转换而是直接报错了。

3. 一般情况下,此关键字不要修饰析构函数 

因为如果使用=delete修饰析构函数,那么我们创建的对象就无法释放了。会一直占用空间。因为释放对象,是需要调用析构函数的。 

=default 

概述 

default就是默认的意思,这个关键字用来修饰构造函数,告诉编译器给函数实现默认的实现。
其实就是给指定函数实现对应默认的代码,适当的使用可以提高代码效率和可读性。

只能用于默认构造,拷贝构造,赋值构造和析构, -- 因为这些函数我们不写,编译器也会替我们写(编译器知道默认怎么写),=default关键字就是让编译器替我们写函数的实现,前提是编译器知道怎么写才行。(也就是默认构造,拷贝构造,赋值构造和析构才行)

当然,如果函数中需要实现我们想要的功能(比如,开辟空间,释放空间等),或者说有函数实现,就不能使用=default来修饰。

如果在类内部给对应函数添加=default,那么其实现的函数是内联的,如果不希望是内联的那就在类外部进行指定=default。

代码例子: 
class A {
public:A() = default;A(const A& a) = default;A& operator=(const A& a) = default;~A() = default;
};

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

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

相关文章

【Keil5-Boot和APP配置】

Keil5-Boot和App配置 ■ Keil5-Boot和APP配置■ 一&#xff1a;sct文件 sct文件配置■ 二&#xff1a;发布版本不需要在 C/C&#xff0c;Asm&#xff0c;Linker&#xff0c;中添加 CMDDEBUG 宏定义。■ 三&#xff1a;Debug版本需要在Linker添加 --pd"-DCMDDEBUG" 才…

windows版本-idea中下载的java版本在哪

1、点击idea的file-projectStructure 进入&#xff1a; 通过电脑目录进入该目录 找到bin目录&#xff0c;copy该目录地址 copy下来之后设置到系统环境变量中

脑电放大 LM386

LM386介绍 LM386 是一种音频集成功放&#xff0c;具有自身功耗低、电压增益可调整电源电压范围大、外接元件少和总谐波失真小等优点&#xff0c;广泛应用于录音机和收音机之中。 电源电压 4-12V 或 5-18V(LM386N-4);静态消耗电流为 4mA;电压增益为20-200dB;在引脚1和8开路时&a…

scan纯享代码 java

scan纯享代码 java 1 scan用法2 next3 nextLine 1 scan用法 在录入中间有回车的字符串的时候&#xff0c;不要使用next&#xff08;&#xff09;和nextLine&#xff08;&#xff09;的配合&#xff01;&#xff01; scan用法 Scanner scannernew Scanner(System.in); String…

【S32K3 MCAL配置】-3.2-CANFD配置-发送“经典CAN/CANFD标准帧“和“经典CAN/CANFD扩展帧“(基于MCAL+FreeRTOS)

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录 实现的架构:基于MCAL层 前期准备工作: 1 评估板S32K312EVB-Q172中CAN外设

【通信原理笔记】【三】模拟信号调制——3.5 角度调制(FM、PM)与其频谱特性

文章目录 前言一、相位与频率二、PM和FM的数学表示三、FM的频谱四、FM信号的带宽——卡松公式总结 前言 在之前介绍的几种调制方式中&#xff0c;我提到信噪比时计算的是用户解调后的信噪比&#xff0c;然而在北邮通信原理课中考虑的是解调器输入的信噪比&#xff0c;即考虑的…

python 图片 中文识别 pytesseract

python 图片 中文识别 pytesseract 参考链接 https://blog.csdn.net/weixin_47754149/article/details/125651707 微信 中 长截图&#xff0c;然后传到 电脑上面 安装 方法 https://digi.bib.uni-mannheim.de/tesseract/ tesseract-ocr-w64-setup-5.3.3.20231005.exe 安装的…

备战蓝桥杯(java)(日益更新)

备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09; 文章目录 备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09;前言&#xff1a;一、c 到 java 须要注意的地方&#xff1a;二、多练java代码&#xff1a;&#xff08;用java代码…

linux常用目录结构(目录命令)--6986字详谈

前面与大家讨论了linux的发展与由来&#xff08;这一块挺多的&#xff0c;小编还没有编写完成&#xff0c;希望大家理解&#xff09;&#xff0c;紧接着谈到了vmware安装及运行所存在的故障&#xff08;鉴定错误&#xff0c;虚拟机没有网&#xff0c;蓝屏等常见现象的总结及处理…

【vim 学习系列文章 20 -- a:mode 的值有哪些?】

请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中&#xff0c;a:mode 常常用于函数内部&#xff0c;以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…

what is tty?

waht is tty? 黑话&#xff1a;TTY 为什么使用Linux的时候CtrlC就会终止一个命令运行,ta是如何设置的? stty -a 桌面切换 CTRL ALT F1 – 锁屏 CTRL ALT F2 – 桌面环境 CTRL ALT F3 – TTY3 CTRL ALT F4 – TTY4 CTRL ALT F5 – TTY5 CTRL ALT F6 – TTY6

力扣HOT100 - 239. 滑动窗口最大值

解题思路&#xff1a; class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length 0 || k 0) return new int[0];Deque<Integer> deque new LinkedList<>();int[] res new int[nums.length - k 1];// 未形成窗口for(int i 0; i <…

ITK 重采样 resample

Itk 重新采样有二多种情况&#xff0c;这里说二种情况 1. 输入参数 &#xff0c;和输出相关数据&#xff0c;输出范围&#xff0c;spacing &#xff1b; typedef itk::Image< float, 3 > itkFloatImageType;typedef itk::ResampleImageFilter < itkFloatImageType, i…

实验:基于Red Hat Enterprise Linux系统建立RAID磁盘阵列

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 什么是磁盘阵列&#xff08;RAID&#xff09; 1. 为虚拟机添加4块大小为20G的硬盘nvme0n【2-5】&#xff0c;将nvme0n【2、3、4】三块硬盘 建立为raid5并永久挂载&#xff0c;将RAID盘全部空间制作逻辑卷&#…

【日期】获取当天以及未来三天的日期和周几

// 获取当天以及未来三天的日期和周几getDates() {const today new Date();const dayOfWeek ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];const todayDate today.toDa…

Markdown语法笔记1——1.箭头上带字母;2.字母上带箭头、尖号、~、上横线、下横线、·、··等符号

文章目录 一 箭头上带字母1. 箭头上面写字母&#xff08;1&#xff09;箭头向右&#xff08;1&#xff09;箭头向左 二 字母上带符号1. 带箭头1.1 右箭头&#xff08;向量&#xff09;1.2 右箭头1.3 左箭头 2. 带尖号2.1 宽的上尖号2.2 窄的上尖号2.3 宽的下尖号2.4 窄的下尖号…

pe格式从入门到图形化显示(九)-重定位表

文章目录 前言一、什么是Windows PE格式中的重定位表表&#xff1f;二、解析重定位表并显示1.重定位表的结构2.解析重定位表3.显示重定位表 前言 通过分析和解析Windows PE格式&#xff0c;并使用qt进行图形化显示 一、什么是Windows PE格式中的重定位表表&#xff1f; 重定位…

nandgame中的Grammar(语法)

题目说明&#xff1a; 语法定义涉及数字、括号和运算符和-的表达式的语法。起始符号为Expression。一个表达式应该对应于以下之一&#xff1a;一个数字标记Expression ExpressionExpression - Expression- Expression( Expression ) level help 通过语法来描述高级语言的…

[RK-Linux] RK3399使用开源TPL与SPL方式加载U-Boot

文章目录 一、U-Boot1.1 下载源码1.2 配置U-Boot1.2.1 配置串口波特率1.2.2 配置U-Boot启动倒计时1.2.3 开启调试信息1.3 编译U-Boot1.4 U-Boot镜像二、idbloader.img2.1 tpl/u-boot-tpl.bin2.2 spl/u-boot-spl.bin三、u-boot.idb3.1 FIT介绍

SMT用料全检抽检

下载地址百度网盘&#xff1a; https://pan.baidu.com/s/1kDn_l8P6ReC4Lj5tgt-v4w?pwd5y41 提取码:5y41 1、扫描输入车间线体 2、根据线体获取在线订单 3、选择(全检|抽检|换接新料)开始 4、根据提示扫描站位和料号核对 5、核对成功再扫描核对下一组