【cmu15445c++入门】(14)C++的 =delete和=default

news2025/1/19 20:30:46

一、定义

(1)=default

在C++中,= default 是一种特殊的语法,用于显式地请求编译器生成一个函数的默认实现。当应用于构造函数时,= default 告诉编译器生成一个默认构造函数。默认构造函数是一个不接受任何参数的构造函数。

(2)=delete

在C++中,=delete 是一种特殊的语法,用于显式地删除(禁止)某个函数的生成。当应用于函数时,=delete 表示该函数不应被生成,尝试调用该函数会导致编译错误。

二、代码样例

(1)=default

#include <iostream>  
  
class MyClass {  
public:  
    MyClass() = default; // 使用默认构造函数  
    ~MyClass() = default; // 使用默认析构函数  
  
    MyClass(const MyClass&) = default; // 使用默认复制构造函数  
    MyClass& operator=(const MyClass&) = default; // 使用默认复制赋值运算符  
  
    MyClass(MyClass&&) = default; // 使用默认移动构造函数  
    MyClass& operator=(MyClass&&) = default; // 使用默认移动赋值运算符  
  
    void sayHello() const {  
        std::cout << "Hello from MyClass!" << std::endl;  
    }  
};  
  
int main() {  
    MyClass obj1; // 调用默认构造函数  
    obj1.sayHello();  
  
    MyClass obj2 = obj1; // 调用默认复制构造函数  
    obj2.sayHello();  
  
    MyClass obj3(std::move(obj1)); // 调用默认移动构造函数  
    obj3.sayHello();  
  
    obj2 = obj3; // 调用默认复制赋值运算符  
    obj2.sayHello();  
  
    obj2 = std::move(obj3); // 调用默认移动赋值运算符  
    obj2.sayHello();  
  
    return 0;  
}

(2)=delete

#include <iostream>  
  
class NonCopyable {  
public:  
    NonCopyable() = default; // 默认构造函数  
    ~NonCopyable() = default; // 默认析构函数  
  
    NonCopyable(const NonCopyable&) = delete; // 禁止复制构造函数  
    NonCopyable& operator=(const NonCopyable&) = delete; // 禁止复制赋值运算符  
  
    NonCopyable(NonCopyable&&) = default; // 默认移动构造函数  
    NonCopyable& operator=(NonCopyable&&) = default; // 默认移动赋值运算符  
  
    void doSomething() const {  
        std::cout << "Doing something in NonCopyable." << std::endl;  
    }  
};  
  
int main() {  
    NonCopyable nc1; // 调用默认构造函数  
    nc1.doSomething();  
  
  
    NonCopyable nc3(std::move(nc1)); // 调用默认移动构造函数  
    nc3.doSomething();  
  
    nc1 = std::move(nc3); // 调用默认移动赋值运算符  
    nc1.doSomething();  
  
    // NonCopyable nc2 = nc1; // 错误:复制构造函数被删除  
    // nc1 = nc2; // 错误:复制赋值运算符被删除  

    return 0;  
}


 

不难发现,我们在最后两行,如果执行了复制的方法,那么不仅编译不通过,还会直接在命令行提示错误。

     NonCopyable nc2 = nc1; // 错误:复制构造函数被删除  

     nc1 = nc2; // 错误:复制赋值运算符被删除  

 

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

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

相关文章

Linux给磁盘扩容(LVM方式)

Linux给磁盘扩容&#xff08;LVM方式&#xff09; 最近测试性能&#xff0c;在本地打数据时&#xff0c;发现磁盘空间不足&#xff0c;于是想手动给/挂载点添加空间。这里介绍通过LVM方式快速给磁盘扩容。 LVM:是一种技术&#xff0c;方便管理磁盘。如果不用LVM&#xff0c;那…

经典网络解读—IResNet

论文&#xff1a;Improved Residual Networks for Image and Video Recognition&#xff08;2020.4&#xff09; 作者&#xff1a;Ionut Cosmin Duta, Li Liu, Fan Zhu, Ling Shao 链接&#xff1a;https://arxiv.org/abs/2004.04989 代码&#xff1a;https://github.com/iduta…

IK分词器安装、配置、分词自定义、Rest使用、SpringBoot使用

文章目录 1. 概述2. 安装配置3. 自定义拆分文本4. 调用4.1 拆分规则4.2 Rest 调用4.3 SpringBoot 调用 1. 概述 IK分词器是ElasticSearch(es)的一个最最最有名插件&#xff0c;能够把一段中文或者别的语句划分成一个个的关键字&#xff0c;进而在搜索的时候对数据库中或者索引库…

并发场景下 缓存击穿 穿透 雪崩如何解决

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 群号 208236931&#xff0c;欢迎进群交流学习&#xff0c;一起进步、进步、…

3.4 海思SS928开发 - 烧写工具 - BurnTool Emmc 烧写

3.4 烧写工具 - BurnTool Emmc 烧写 BurnTool 工具提供了多种烧写方式&#xff0c;这里只介绍最常用的 烧写emmc方式。 环境准备 PC 与单板之间连接好调试串口以及网线。 将厂商提供的出厂镜像拷贝至 PC 硬盘上&#xff0c;解压后得到的文件如下&#xff1a; . ├── boot_…

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下&#xff0c;运行一个可执行文件的时候&#xff0c;可能会出现找不到依赖库的情况&#xff0c;比如图下这种情况&#xff0c;可以看到是缺少了license.dll或者libtest.so&#xff0c;所以无法运行。怎么知道它到底缺少什么dll呢&…

收藏这份方案,制造业营销管理快人一步【内附下载链接】

随着“中国制造2025”等政策的实施&#xff0c;制造业正经历着技术革新和产业升级&#xff0c;尤其在智能化和绿色制造领域取得了显著进展。 然而&#xff0c; 制造业面临着消费者需求日益多样化和个性化的挑战&#xff0c;迫切需要从生产导向转变为市场导向。与此同时&#…

Transformer中的位置编码详解

什么是位置编码 位置编码概述 位置编码的目的是为了补充序列的位置信息&#xff0c;这是因为自注意力机制本身不包含位置的概念&#xff08;例如顺序信息&#xff09;。位置编码的具体作用是&#xff0c;对于不同的输入序列成分&#xff0c;赋予其不同的位置标识&#xff0c;确…

RIP小实验配置及缺省路由下发

配置如下&#xff1a; IP配置&#xff1a; IP配置完先查看RIP协议学习到的路由表&#xff0c;没有内容则代表没有开启RIP 启用RIP&#xff1a;这里的rip后跟的ID只具有本地意义&#xff0c;可以在1-65535之间随便取&#xff0c;不同路由器之间都可以取用不同的&#xff0c;为了…

宿舍预付费管控云平台

1.宿舍预付费管控云平台概述 宿舍预付费管控云平台是一种创新的智能管理系统&#xff0c;专为学校、公寓等住宿环境设计&#xff0c;旨在提升管理效率&#xff0c;优化用户体验&#xff0c;并实现资源的高效利用。通过云端技术&#xff0c;该平台可以实现远程充值、实时消费记…

Day 30 回溯总结

重新安排行程(*) 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

设置表格高度后,数值改变但实际不变

1.选中表格 2.点击“开始”——>“段落设置”的选项启动按钮&#xff0c;设置为单倍行距 3.可以看到&#xff0c;表格的行高被调小了。

【SLAM】在Win10上实现Nerf-Pytorch【GPU版】

文章目录 ReadMe安装依赖运行下载两个示例数据集:lego和fern训练一个低分辨率的Lego NeRF:训练一个低分辨率蕨类植物NeRF:更多数据集预训练模型可复现实现1、下载nerf-pytorch工程2、安装依赖3、下载数据4、运行lego NeRF:ReadMe Github链接 NeRF (神经辐射场)是一种在合成…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

理解Docker容器和镜像的区别

容器镜像读写层 容器最上边那一层是可读可写的。 镜像可以看作是面向对象编程中的类。 文章目录 一、镜像&#xff08;只读层的集合&#xff09; 二、容器&#xff08;多层只读层一层读写层&#xff09; 三、镜像层 一、镜像&#xff08;只读层的集合&#xff09; 镜像&…

Vue3从入门到实战:深度了解相关API

shallowRef 作用&#xff1a;创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。 用法&#xff1a; let myVar shallowRef(initialValue); 特点&#xff1a;只跟踪引用值的变化&#xff0c;不关心值内部的属性变化。 shallowReactive 作用&#xff1a;创建一个…

ASPICE 追溯性实践分享

01前言 接着之前的分享&#xff0c;遗留的追溯性ASPICE 认证实践及个人理解分享-CSDN博客文章浏览阅读961次&#xff0c;点赞22次&#xff0c;收藏17次。ASPICE是Automotive 和SPICE的组合&#xff0c;全英文为&#xff08;Automotive Software ProcessImprovement and Determ…

【全】一文读懂 containerd 中的 NRI 机制

本文内容节选自 《containerd 原理剖析与实战》&#xff0c;本书正参加限时优惠内购&#xff0c;限时 69.9 元购买。 本文介绍 containerd 中的一种可插拔的扩展机制 NRI。 1. NRI 介绍 NRI&#xff08;Node Resource Interface&#xff09;&#xff0c;即节点资源接口。是 c…

汇编语言——输入16位二进制数,存入BX

这是我原先的做法&#xff1a; shl bx,1 ;bx逻辑左移一位 sub dl,30h ;键盘输入的0/1&#xff0c;ASCII码分别为30h/31h&#xff0c;要转换成0/1 add bl,dl ;bl逻辑左移一位后加上现在输入的字符data segment data ends stack segment stackdw 100 dup (?)top label wo…

Oracle数据库 :查询表结构脚本

查询脚本 &#xff1a; SELECT CASE WHEN a.column_id1 THEN a.TABLE_NAME ELSE END AS 表名, a.column_id AS 序号, a.column_name as 列名, REPLACE(comments, CHR(10), ) as 列说明, a.data_type || ( || a.data_length || ) as 数据类型, a.DATA_LENGTH AS 长度, a.DATA_…