[C++11] 初始化语法、explicit关键字、final override关键字、delete default关键字

说明:C++11 引入了初始化语法、explicit关键字、final && override关键字、delete && default关键字 等新特性,旨在改善语言的功能性、安全性和表达能力。具体说明如下:

  • 引入初始化列表和统一的初始化语法的原因:在 C++11 之前,存在多种不同的初始化语法,这可能导致混淆和不一致性。引入初始化列表和统一的初始化语法旨在提供一种更加直观和一致的方式来初始化对象,无论是内置类型、自定义类还是容器。这种新的初始化方式也有助于避免意外的错误,例如将赋值操作误解为初始化。
  • 引入explicit关键字的原因:在 C++98/03 中,单参数构造函数和具有默认参数的函数经常导致意外的隐式类型转换,这可能导致程序中出现难以追踪的错误。引入 explicit 关键字可以防止这些隐式转换,确保构造函数只能用于显式构造,从而提高代码的安全性和可读性。
  • 引入 final && override关键字的原因:finaloverride 关键字的引入是为了提供更多的编译时检查,确保程序员的意图得到正确实现。final 阻止进一步派生和覆盖,而 override 明确指出函数覆盖了基类中的虚函数。这些特性有助于防止错误的继承和覆盖行为,提高代码的可靠性和维护性。
  • 引入delete && default关键字的原因:在 C++11 之前,没有直接的方式来显式禁用某些操作(如复制或移动)。deletedefault 关键字的引入允许开发者精确控制类的某些行为。使用 delete 可以禁止某些操作,如自定义类型的拷贝构造,而 default 允许编译器生成默认实现,这在某些情况下可以简化代码并提高性能。

总的来说,C++11 的这些新特性都是为了使语言更加安全、清晰和强大。它们提供了更好的控制机制,减少了潜在的错误,并使得代码更加易于理解和维护。通过这些改进,C++11 旨在提高开发者的生产力,同时保持代码的性能和效率。

接下来详细看看这些语法的详细解读。

1 初始化语法:初始化列表和统一的初始化语法

C++11 引入了列表初始化(List-initialization)的概念,允许开发者使用花括号 {} 来初始化对象。这种方式不仅适用于基本类型和容器,也适用于自定义类型。列表初始化提供了一种统一的语法,使得初始化过程更加直观和一致。参考代码如下所示:

// 基本类型
int i{10}; // 使用列表初始化// 类类型
class MyClass {
public:MyClass(int a, double b) : a_(a), b_(b) {}
private:int a_;double b_;
};MyClass obj{10, 3.14}; // 使用列表初始化// 容器
std::vector<int> vec{1, 2, 3, 4, 5};

2. explicit 关键字

explicit 关键字用于防止隐式类型转换,确保构造函数只能被显式调用。在 C++11 之前,某些情况下编译器可能会自动将类型转换为类类型,这可能导致意外的行为。使用 explicit 可以防止这种情况的发生。参考代码如下所示:

class MyClass {
public:explicit MyClass(int value) {// ...}
};// 显式转换
MyClass obj1(10);// 隐式转换将不再被允许
// MyClass obj2 = 10; // 错误

3. final && override 关键字

final 和 override 关键字用于控制派生类的继承行为。

  • final 用于指定一个类不能被进一步派生,或者一个成员函数不能被派生类中的进一步覆盖。这有助于防止不正确的继承和覆盖。
  • override 关键字用于明确指出一个成员函数覆盖了基类中的虚函数。如果一个函数被错误地标记为 override,但实际并没有覆盖任何基类的虚函数,编译器将会报错。

参考代码如下所示:

class Base {
public:virtual void foo() {// ...}
};class Derived final : public Base {
public:void foo() override { // 明确覆盖基类的 foo 函数// ...}// Derived *d = new Derived(); // 错误,因为 Derived 是 final 类
};class OtherDerived : public Derived {
public:void foo() override { // 错误,不能覆盖,因为 Derived::foo 没有被标记为 virtual// ...}
};

4. delete && default 关键字

C++11 允许使用 delete 和 default 关键字来显式禁止或允许某些操作,例如构造函数、拷贝构造函数、移动构造函数、赋值操作符等。

  • delete 关键字用于显式禁止某些操作。例如,如果一个类没有提供拷贝构造函数,可以使用 = delete 来禁止拷贝操作。
  • default 关键字用于显式允许编译器生成默认的函数实现。例如,如果一个类没有显式提供拷贝构造函数,但希望使用编译器生成的默认实现,可以使用 = default。

参考代码如下所示:

class MyClass {
public:MyClass() = default; // 允许编译器生成默认构造函数MyClass(const MyClass&) = delete; // 禁止拷贝构造MyClass& operator=(MyClass&&) = default; // 允许编译器生成移动赋值操作符的默认实现void someFunction() = 0; // 纯虚函数,必须在派生类中实现
};// 使用 delete 禁止拷贝构造函数的调用
MyClass a;
MyClass b = a; // 错误,拷贝构造函数已被禁止

这些新特性为 C++ 程序员提供了更多的控制权,使得代码更加安全、清晰和易于维护。通过使用这些特性,可以减少潜在的错误,提高代码的质量和性能。

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

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

相关文章

分布式的计算框架之Spark(python第三方库视角学习PySpark)

基本介绍 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎 。现在形成一个高速发展应用广泛的生态系统。 特点介绍 Spark 主要有三个特点&#xff1a; 首先&#xff0c;高级 API 剥离了对集群本身的关注&#xff0c;Spark 应用开发者可以专注于应用所要做的计…

transformer在生物基因DNA的应用:DNABERT、DNABERT-2

参考&#xff1a; https://www.youtube.com/watch?vmk-Se29QPBA&t1388s 写明这些训练模型可以最终训练好可以进行DNA特征向量的提取&#xff0c;应用与后续1、DNABERT https://github.com/jerryji1993/DNABERT 主要思路就是把DNA序列当成连续文本数据&#xff0c;直接用…

维修伊顿触摸屏不显示工业电脑人机界面EATON XVS-430-10MPI-1-10 深圳捷达工控维修

人机界面 (HMI) XP500 工业 PC 系列 以不同的方式思考工业平板电脑 对于严酷、高要求的应用&#xff0c;工业平板电脑设定了可配置性和稳健性的标准。伊顿的 XP500 系列工业平板电脑凭借防刮钢化玻璃屏幕、铸铝外壳和无风扇设计满足了这些需求。这些功能使 XP500 HMI成为一款节…

ES11-12

1-ES11-Promise.allSettled Promise.allSettled0)方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。 简单来说不管成功失败都会调用.then()&#xff0c;然后处理成功和失败的结果 const promises [ …

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

使用moviepy进行音视频处理(超全面)

在这篇博客中,我们将探讨如何使用Python处理视频文件,包括读取视频参数、剪切视频片段、合并视频片段、裁剪视频以及调整视频大小等功能。这些功能可以广泛应用于视频编辑、视频处理等场景。 1. 视频参数获取 首先,我们定义了一个 video_parameters 函数,用于读取视频文件的一…

淘宝商品详情API数据采集接口|如何快速采集淘宝商品数据?

如何快速采集淘宝商品数据 无论是谁&#xff0c;如果单凭人工的方式去收集淘宝、天猫等平台的商品数据信息&#xff0c;工作量是巨大的&#xff0c;如果借助有采集软件的第三方公司操作&#xff0c;则可实现对大数据的轻松掌握&#xff0c;但是外包给第三方公司需要支付一定的…

javaee初阶———多线程(三)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题第三篇,关于线程安全方面的内容 如果有不足的或者错误的请您指出! 目录 八、线程安全问题(重点)1.一个典型的线程不安全的例子2.出现线程不安全的原因3.解决线程不安…

每日一题:C语言经典例题之百文买百鸡

题目描述 公鸡五文钱一只&#xff0c;母鸡三文钱一只&#xff0c;小鸡一文钱三只&#xff0c;用m文钱买m只鸡&#xff0c;公鸡、母鸡、小鸡各买多少只&#xff1f; 输入 正整数m。 输出 只输出一个解&#xff0c;即公鸡数量最少的那个解&#xff08;输出公鸡、母鸡和小鸡的只数…

Frp多端口映射

使用AutoDL在内网搭建私有云&#xff0c;为了方便公网访问&#xff0c;需要将端口10000-11000进行内网穿透。 参考文档frp0.41使用说明 官方github仓库 1 Frp安装 见博客 frp安装及系统配置教程 建议为frp设置验证方式&#xff0c;具体做法见官方文档&#xff0c;若用toke…

Vultr服务器连接不上有哪些解决办法

近年来人们对vps主机的使用不断的呈上升的状态&#xff0c;很多人在选择国外vps主机的时候会选择Vultr美国主机商&#xff0c;因为他们的主 机性价比超高&#xff0c;同时在全球范围的数据中心也是比较多&#xff0c;我们知道服务器在使用中总会出现问题的&#xff0c;那么Vult…

对于普通人来说ChatGPT3.5和4.0的区别,要不要升级GPT4.0

ChatGPT3.5和4.0在官方给出的有哪些区别呢&#xff1f;简单罗列一下&#xff0c;我个人觉得官方给的都太高级&#xff0c;我们平时普通人很难问ChatGPT这种问题。 官方测试所涉及的能力&#xff1a; 视觉能力代码能力数学计算能力工具使用能力与人的交互能力人类专业考试的能…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中&#xff0c;我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下&#xff0c;而且会打断开发流程。幸运的是&#xff0c;有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案

AR眼镜作为一种引人注目的创新产品&#xff0c;其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中&#xff0c;我们将探讨AR眼镜的关键技术&#xff0c;并介绍一种高性能的AR眼镜方案&#xff0c;旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…

数据结构---绪论

一、绪论&#xff1a; 1.什么是数据&#xff1f; 数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素--描述一个个体 数据元素&#xff0c;数据项&am…

React + 项目(从基础到实战) -- 第七期

使用ant design 表单组件,开发登录,注册,搜索功能 React 表单组件 ,受控组件 案列 使用defaultVlue属性 bug : 改变了数据源,但是页面未重新渲染 {/* 表单组件 */}<button onClick{()>{console.log(text);}}>打印</button><button onClick{()>[setText(&…

【质量管理】“从计划到部署:软件开发的全周期质量保证手册

在软件开发中&#xff0c;质量保证&#xff08;QA&#xff09;是一个贯穿整个开发生命周期的过程&#xff0c;而不仅仅是在开发结束后的一个阶段。确保软件质量涉及多个流程和实践&#xff0c;下面是在各个开发阶段中如何进行质量保证的策略&#xff1a; 1. 需求分析和规划阶段…

【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Static成员 1、概念 2、特性 二、友元 1、友元函数 2、友元类 一、Static成员 1、概念 声…

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上&#xff1a;InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告&#xff1a;arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

【读书笔记】自动驾驶与机器人中的SLAM技术——高翔

文章会对本书第五章节及以后章节进行总结概括。每日更新一部分。一起读书吧。 第五章——基础点云处理 重点&#xff1a;点云的相邻关系是许多算法的基础 5.1 激光雷达传感器与点云的数学模型 5.1.1激光雷达传感器的数学模型 雷达有两种&#xff1a;机械旋转式激光雷达&…