当前位置: 首页 > 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的梯…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...