当前位置: 首页 > news >正文

C++11新的类功能

文章首发公众号:iDoitnow

1. 特殊的成员函数

C++11在原有的4个特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符和析构函数)的基础上新增了移动构造函数和移动赋值运算符。这些特殊成员函数在各种情况下是会通过编译器自动提供的。

  • 默认构造函数:如果未定义任何构造函数,编译器将提供一个默认构造函数,对于类成员则调用其默认构造函数(对于内置的成员,默认构造函数不对其进行初始化。如果使用者提供了移动构造函数,编译器将不会自动提供默认构造函数)。
  • 复制构造函数:如果未定义复制构造函数,而代码有需要使用它,编译器将提供一个默认的复制构造函数。(如果使用者提供了类的移动构造函数的情况下,编译器将不会自动提供复制构造函数)
  • 移动构造函数:如果未定义移动构造函数,而代码有需要使用它,编译器将提供一个默认的移动构造函数。(如果使用者提供了类的析构函数、复制构造函数、复制赋值运算符或移动赋值运算符的情况下,编译器将不会自动提供移动构造函数)
  • 复制赋值运算符:如果未定义复制赋值运算符,而代码有需要使用它,编译器将提供一个默认的复制赋值运算符。(如果使用者提供了移动赋值运算符,编译器不会自动提供复制赋值运算符)
  • 移动赋值运算符:如果未定义移动赋值运算符,而代码有需要使用它,编译器将提供一个默认的移动赋值运算符。(如果使用者提供了复制构造函数、移动构造函数、复制赋值运算符或析构函数,编译器不会自动提供移动赋值运算符)

当用户在定义某些特殊函数后,导致另外某个特殊函数不会自动创建,这时候用户仍可以使用关键词 default 强制编译器生成隐式声明的目标特殊成员函数函数。例如用户定义了移动构造函数,编译器不会自动构建默认构造函数、复制构造函数和复制赋值运算符,这种情况下我们可以通过default强制编译器创建这些方法的默认版本:

class A{public:A(A &&);A() = default;A(const A&) = default;A & operator = (const A&) = default;
};

同时,有些时候,我们不希望编译器为我们提供某个特殊的成员函数默认版本,我们可以使用关键字delete来禁止编译器使用特定方法。关键字default只能用于这个6个特殊的成员数(默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数),但delete可以用于任何成员函数。例如:

class A{public:A() = delete;//禁止编译器生成默认构造函数void readDoubleNum(double);
}class B{public:B() = delete;//禁止编译器生成默认构造函数void readDoubleNum(double);void readDoubleNum(int) = delete;//禁用readDoubleNum函数的特定转换
};A a;
a.readDoubleNum(5.0);//正确
a.readDoubleNum(5);//正确,int值5将被转换为5.0,进而执行readDoubleNum(double)方法B b;
b.readDoubleNum(5.0);
b.readDoubleNum(5);//错误,其与readDoubleNum(int)原型匹配,编译器检测到该方法被禁用后,在编译阶段就会报错,防止int到double的特定转换

2. override和final

  • override标识符

    override说明符的作用是用来指定一个虚函数覆盖另外一个虚函数。其用法如下:

    class A{virtual void fun();...
    };class B : A{void fun() override;//B::fun将覆盖A::fun...
    };
    

    C++11引入override标识符的目的就是为了在重写基类的方法时候,防止重写方法的类型、名称和参数列表因为人为因素造成其与基类的不一致,无法使用多态。使用override标识符将重写的检查工作(重写方法的类型、名称和参数列表要与基类的保持一致)交给编译器处理,减少人为出错的可能。

  • final标识符

final标识符的作用是指定某个虚函数不能在派生类中被覆盖,或者某个类不能被派生。其使用方法如下:

calss A{virtual void fun();
};class B : A{void fun() final;//A::fun被覆盖,而且B::fun是最终被覆盖函数void ba() final;//错误,ba非虚函数,因此它不能是final
};class C final: B{//C为finalvoid fun() override;//错误,fun不能被覆盖,因为其在B中为final
};class D : C{};//错误,因为类C位final,其不可以被派生

参考文献

C++ Primer Plus(第六版) - 第18章 探讨C++新标准
C++ 参考手册

相关文章:

C++11新的类功能

文章首发公众号:iDoitnow 1. 特殊的成员函数 C11在原有的4个特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符和析构函数)的基础上新增了移动构造函数和移动赋值运算符。这些特殊成员函数在各种情况下是会通过编译器自动提供的。 …...

Laravel创建定时任务

创建一个任务,创建成功后会在App/Console/Commands中生成一个以Test命名的文件,我们可以在这里面写我们的任务指令。 php artisan make:command Test 运行这个定时任务 run 是运行一次,我们可以用来测试是否成功,work是一直运行&a…...

SaveInstanceState

1. 保存与读取当前状态,MainActivity.java public class MainActivity extends AppCompatActivity {private String TAG "MyLog";TextView textView;Button button;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedI…...

Fluent Python 笔记 第 16 章 协程

从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数。可是,在协程中,yield通常出现在表达式的右边(例如,datum yield),可以产出值,也可以不产出——如果 yield 关键字后面没有表…...

山东科技大学校历 代码分析 获得以前学期学年的老版校历

校历-山东科技大学网络安全与信息化办公室http://tech.sdust.edu.cn/wlfw/xl.htm JavaScript var studyStart new Date(2021, 8-1, 30);//8-1 -1没有意义,30代表30号,2021年8月30号开始这个学期 var commonWeeks 19;//这个学期有多少周 var s…...

第五章.与学习相关技巧—权重初始值(随机初始值,Xavier初始值,He初始值)

第五章.与学习相关技巧 5.2 权重初始值 本节将介绍权重初始值的推荐值,并通过实验确认神经网络的学习是否会快速进行。 1.权值衰减 权值衰减就是一种以减少权重参数的值为目的进行学习的方法,通过减少权重参数值来抑制过拟合的情况发生。 2.权重初始值不…...

Linux进程间通信(管道)

进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如…...

写一个基于node.js的api后台管理系统(三)

创建登录页面 在项目目录下创建一个名为public的文件夹&#xff0c;并在其中创建一个HTML文件login.html。添加以下代码&#xff1a; <!DOCTYPE html> <html> <head><title>Login - Task Management</title> </head> <body><h1…...

【23种设计模式】行为型模式详细介绍(上)

前言 本文为 【23种设计模式】行为型模式 相关内容介绍&#xff0c;下边将对访问者模式&#xff0c;模板模式&#xff0c;策略模式&#xff0c;状态模式&#xff0c;观察者模式&#xff0c;备忘录模式&#xff0c;中介者模式&#xff0c;迭代器模式&#xff0c;解释器模式&…...

PID控制算法进阶

关于PID控制算法基础概念在本文不再重复了&#xff0c;详情可参考&#xff1a;PID控制算法基础介绍 本文主要从PID算法代码实现&#xff0c;代码解析&#xff0c;理论进阶&#xff0c;PID调参等方向进行阐述。 目录位置式PID和增量式PID1.1 位置式PID1.2 增量式PID1.3 位置式和…...

嵌入式工程师有什么值得一看的网站和书籍吗?

原文直达&#xff1a; 嵌入式工程师有什么值得一看的网站和书籍吗&#xff1f; - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/68423119/answer/2885623392 我是资深网站保存爱好者&#xff0c;浏览器分门别类存了应该有几百个网址&#xff0c;关于嵌入式的也有很…...

操作系统的四个特征

一、并发 并发&#xff1a;是指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的&#xff0c;但微观上是交替发生的。 并行&#xff1a;指两个或多个事件在同一时刻同时发生。 操作系统的并发性指计算机系统中同时存在着多个运行的程序。操作系统和程序并发…...

Django框架之模型shell工具和查看MySQL数据库日志

shell工具和查看MySQL数据库日志 1 shell工具 Django的manage工具提供了shell命令&#xff0c;帮助我们配置好当前工程的运行环境&#xff08;如连接好数据库等&#xff09;&#xff0c;以便可以直接在终端中执行测试python语句。 通过如下命令进入shell python manage.py …...

电脑录屏怎样不录到外界声音?调整这一个开关,即可实现

​有很多小伙伴希望自己电脑录屏的时候&#xff0c;不要录制自己的声音&#xff0c;而是通过后期配音的方式完成视频创作。电脑录屏怎样不录到外界声音&#xff1f;其实只需要调整这一个开关&#xff0c;就能实现不录外界声音&#xff0c;一起来看看吧。 不录外界声音1&#xf…...

无需登录复制网站文字的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

ccc-Tips for Deep Learning-李宏毅(8)

文章目录Recipe of Deep LearningGood Results on Training DataNew activation functionAdaptive Learning RateGood Results on Testing DataEarly StoppingRegularizationDropoutwhy Dropout work&#xff1f;Reason for bias&varianceDropout is a kind of ensembleRec…...

ArkUI新能力,助力应用开发更便捷

ArkUI是一套构建分布式应用的声明式UI开发框架。它具备简洁自然的UI信息语法、丰富的UI组件、多维的状态管理&#xff0c;以及实时界面预览等相关能力&#xff0c;帮助您提升应用开发效率&#xff0c;并能在多种设备上实现生动而流畅的用户体验。随着HarmonyOS 3.1版本的发布&a…...

vue面试题大全

Vue面试题大全一.vue的基本原理二.双向数据绑定的原理三.使用object.defineProperty()来进行数据劫持有什么缺点&#xff1f;一.vue的基本原理 当一个vue实例创建的时候&#xff0c;vue会遍历data中的属性&#xff0c;用object.defineProperty&#xff0c;将它们转为getter/se…...

P1307 [NOIP2011 普及组] 数字反转

[NOIP2011 普及组] 数字反转 题目描述 给定一个整数 NNN&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&#xff0c;否则反转后得到的新数的最高位数字不应为零&#xff08;参见样例 2&#xff09;。 输入…...

【服务器数据恢复】NetApp存储无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; NetApp某型号存储&#xff1b; 配备SAS硬盘&#xff0c;该硬盘520字节一个扇区&#xff1b; 所有的lun映射到小型机使用&#xff0c;存放Oracle数据库文件&#xff0c;采用ASM裸设备存储方式。 服务器故障&#xff1a; 管理员误操作删除NetApp…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...