【C++11保姆级教程】delete和default关键字

文章目录

  • 前言
  • 一、delete关键字
    • 1.1 什么是delete关键字?
    • 1.2delete关键字的语法和用法
    • 1.3delete关键字的作用和优势
  • 二、default关键字
    • 2.1 什么是default关键字?
    • 2.2default关键字的语法和用法
    • 2.3 default关键字的作用和优势
  • 总结


前言

欢迎来到本教程,今天我们将学习C++11中的两个关键字:delete和default。这两个关键字为我们提供了更清晰和更灵活的方式来控制类的默认行为。无论您是初学者还是有经验的开发人员,本教程都将以通俗易懂的语言解释这两个关键字的概念和用法。让我们开始吧!


一、delete关键字

1.1 什么是delete关键字?

在C++11中,delete关键字可以用于删除类的特殊成员函数或禁止使用特定的函数。通过使用delete关键字,我们可以明确地告诉编译器某个函数是禁止的,从而防止使用者无意中调用它们。

注意:是类中的成员函数或禁止使用特定的函数,不要放错了地方。

1.2delete关键字的语法和用法

在函数声明或定义中,我们可以使用delete关键字来删除或禁用函数。下面是一些使用delete关键字的示例:

class MyClass {
public:// 删除默认构造函数MyClass() = delete;// 删除拷贝构造函数MyClass(const MyClass&) = delete;// 删除赋值运算符MyClass& operator=(const MyClass&) = delete;// 删除特定参数的构造函数MyClass(int value) {// 构造函数实现...}// 删除特定参数的成员函数void foo() {// 函数实现...}
};int main() {MyClass obj1;           // 编译错误:无法使用删除的默认构造函数MyClass obj2(obj1);     // 编译错误:无法使用删除的拷贝构造函数obj1 = obj2;            // 编译错误:无法使用删除的赋值运算符MyClass obj3(10);       // 正常调用带参数的构造函数obj3.foo();             // 正常调用成员函数return 0;
}

我们还可以使用他删除全局函数:
在这里插入图片描述

1.3delete关键字的作用和优势

防止误用:使用delete关键字可以明确禁止调用特定函数,从而防止用户错误地调用这些函数。比如,我们可以删除默认构造函数,防止用户通过不经意间创建对象。
提供更好的错误提示:通过使用delete关键字,编译器可以提供更明确的错误信息,告诉我们哪些函数是被删除的,为什么无法使用它们。

二、default关键字

2.1 什么是default关键字?

在C++11中,default关键字用于显式声明编译器生成的默认实现。当我们需要使用默认实现时,可以使用default关键字告诉编译器去生成对应的函数代码。

2.2default关键字的语法和用法

默认情况下,编译器会自动生成一些特殊成员函数,如默认构造函数、拷贝构造函数和赋值运算符。但是,我们也可以显式地声明使用编译器提供的默认实现。下面是一些使用default关键字的示例:

class MyClass {
public:// 默认构造函数(使用默认实现)MyClass() = default;// 拷贝构造函数(使用默认实现)MyClass(const MyClass&) = default;// 拷贝赋值运算符(使用默认实现)MyClass& operator=(const MyClass&) = default;// 移动构造函数(自定义实现)MyClass(MyClass&& other) {// 移动构造函数的自定义实现...}
};int main() {MyClass obj1;        // 调用默认构造函数MyClass obj2(obj1);  // 调用拷贝构造函数obj1 = obj2;         // 调用拷贝赋值运算符return 0;
}

2.3 default关键字的作用和优势

显式声明默认实现:通过使用default关键字,我们可以明确地告诉编译器要使用默认实现,使代码更加清晰和易读。
自动生成特殊成员函数:当我们显式声明一个特殊成员函数时,如拷贝构造函数,但没有提供实现时,编译器会自动生成该函数的默认实现。


总结

在本教程中,我们学习了C++11中的两个关键字:delete和default。delete关键字用于删除或禁止使用特定的函数,让我们能够更精确地控制类的行为,并提供更好的错误检测和报告。default关键字用于显式声明编译器生成的默认实现,使代码更清晰易读,并自动生成特殊成员函数的默认实现。通过合理地使用这两个关键字,我们可以编写更可靠、更容易理解和维护的代码。

希望本教程能够帮助您理解delete和default关键字的概念和用法。如果您对C++的学习有更深入的需求,请继续学习其他相关教程和文档。祝您在编写C++程序时能够灵活运用这些知识,取得更好的效果!

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

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

相关文章

竞赛项目 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &#x…

ASP.NET WEB API通过SugarSql连接MySQL数据库

注意:VS2022企业版可以,社区版可能存在问题。实体名称和字段和数据库中的要一致。 1、创建项目,安装SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件结构 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

张俊林:由ChatGPT反思大语言模型(LLM)的技术精要

转自:https://mp.weixin.qq.com/s/eMrv15yOO0oYQ-o-wiuSyw 导读:ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型(LLM,Large Language Model)效果能好成这样;惊醒是顿悟到我们对LLM的认知及发展理念&a…

Cesium--一些实验过程中的效果记录

1.一种反射效果: 片元着色器代码 fragmentShaderSource:in vec3 v_positionMC;in vec3 v_positionEC;in vec2 v_st;void main(){czm_materialInput materialInput;vec3 normalEC normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), ve…

Git命令详解

1 常用命令 1&#xff09;初始化本地仓库 git init <directory> 是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2&#xff09;克隆一个远程仓库 git clone <url> 3&#xff09;添加文件到暂存区 git add <file> 要添加当前目录中的所…

vim键盘图

国外&#xff1a;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#xff0c;原创&#xff0c;有SVG图&#xff0c;有分步骤的图。 国内翻译&#xff1a;[https://blog.csdn.net/qq_41052753/article/details/101031847 有几个配色&#xff0c;很高清&…

Allegro172版本如何在联机模式下使用skill文件操作指导

Allegro172版本如何在Symphony模式下使用skill文件操作指导 在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图 这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件 如下图,当调用skill的时候就会出现…

SpringMVC拦截器

1.拦截器简介 拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 总结&#xff1a;拦截器就是用来做增强 看完以后&#xff0…

Raspberry Pi Pico RP2040制作低成本FPGA JTAG工具

目录 1 准备工作和前提条件 1.1 Raspberry Pi Pico RP2040板子一个 1.2 xvcPico.uf2固件 1.3 Vivado USB驱动 2 操作指南 2.1 按住Raspberry Pi Pico开发板的BOOTSEL按键&#xff0c;再接上USB接口到电脑 2.2 刷入固件 2.3 Vivado USB 驱动 2.3.1 打开Zadig驱动工具 2.3…

江南大学计算机考研分析

24计算机考研|上岸指南 江南大学 江南大学计算机考研招生学院是人工智能与计算机学院。目前均已出拟录取名单。 江南大学人工智能与计算机学院成立于2020年3月&#xff0c;办学历史可追溯到1994年设立的计算机应用专业。学院秉持江南大学“彰显轻工特色&#xff0c;服务国计民…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

ISIS技术(第三十七课)

1 分享一下华为官网上的一张地图 官网地址:https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967&id=ZH-CN_CONCEPT_0000001501534705 2 路由的分类 -直连路由 直接连接的路由,且配置了IP地址之后(在同一网段内),就是直连路由。 -非直连路由 -静态路由…