The “Rule-of-Zero“ should be followed (s4963)
Most classes should not directly handle resources, but instead, use members that perform resource handling for them:
- For memory, it can be
std::unique_ptr,std::shared_ptr,std::vector… - For files, it can be
std::ofstream,std::ifstream… - …
Classes that avoid directly handling resources don’t need to define any of the special member functions required to properly handle resources: destructor, copy constructor, move constructor, copy-assignment operator, move-assignment operator. That’s because the versions of those functions provided by the compiler do the right thing automatically, which is especially useful because writing these functions correctly is typically tricky and error-prone.
Omitting all of these functions from a class is known as the Rule of Zero because no special function should be defined.
In some cases, this rule takes a slightly different shape, while respecting the fact that no definition of those functions will be provided:
- For the base class of a polymorphic hierarchy, the destructor should be declared as
publicandvirtual, and defaulted (=default). The copy-constructor and copy-assignment operator should be deleted. (If you want to copy classes in a polymorphic hierarchy, use thecloneidiom.) The move operation will be automatically deleted by the compiler. - For other kinds of base classes, the destructor should be
protectedand non-virtual, and defaulted (=default).
Noncompliant Code Example
class FooPointer { // Noncompliant. The code is correct (it follows the rule of 5), but unnecessarily complexFoo* pFoo;
public:FooPointer(int initValue) {pFoo = new Foo(initValue);}~FooPointer() {delete pFoo;}FooPointer(FooPointer const &fp) = delete;FooPointer const & operator=(FooPointer const &fp) = delete;FooPointer(FooPointer &&fp) noexcept {pFoo = fp.pFoo;fp.pFoo = nullptr;}FooPointer const & operator=(FooPointer &&fp) {FooPointer temp(std::move(fp));std::swap(temp.pFoo, pFoo);return *this;}
};
Compliant Solution
class FooPointer { // Compliant, std::unique_ptr is use to handle memory managementunique_ptr<Foo> pFoo;
public:FooPointer(int initValue) : pFoo(std::make_unique<Foo>(initValue) {}
};
A polymorphic base class can look like this:
class Base { // Compliant, the virtual destructor is defaulted
public:virtual ~Base() = default;Base(Base const &) = delete;Base &operator=(Base const &) = delete;
};
Exceptions
- Empty destructors are treated as though they were defaulted.
- There are several cases when this rule should not be followed. For instance, if your class is manually handling a resource, logging when being constructed/copied, maintaining some kind of counter, having non-transient data that should not be copied (like
capacityforstd::vector)… In that case, it should still follow the rule of 5 (S3624). And you should consider if you can isolate this specific behavior in a base class or a dedicated member data, which would allow you to still follow the rule of 0.
See
- S3624
- S1235
相关文章:
The “Rule-of-Zero“ should be followed (s4963)
Most classes should not directly handle resources, but instead, use members that perform resource handling for them: For memory, it can be std::unique_ptr, std::shared_ptr, std::vector…For files, it can be std::ofstream, std::ifstream…… Classes …...
Kotlin语言特性(二):泛型与注解
Kotlin语言特性(二):泛型与注解 一、引言 在上一篇文章中,我们介绍了Kotlin的三大核心特性。本文将深入探讨Kotlin的泛型和注解特性,并与Java进行对比,帮助你更好地理解和运用这些特性。 二、Kotlin泛型 2.1 泛型基础 2.1.1 声明泛型类 // Kotlin泛型类声明 class …...
FunPapers[3]:WWW‘25「快手」生成式回归预测观看时长
Sequence Generation Modeling for Continuous Value Prediction https://arxiv.org/pdf/2412.20211,www 2025. 文章目录 Sequence Generation Modeling for Continuous Value Prediction核心思想1. CVP常规方法是怎么做的?2. 观看时长预测和CVP是如何关…...
并发编程1
JAVA线程回顾 多线程 多个并行的线程来完成个自的任务,优点是程序响应速度更快,程序性能得到提升。 并行执行与并发执行 并发执行就是在单核CPU下,现成实际上是串行执行的,任务调度器将cpu的时间片分给不同的线程使用࿰…...
Hadoop之01:HDFS分布式文件系统
HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…...
从源到目标:深度学习中的迁移学习与领域自适应实践
云边有个稻草人-CSDN博客 目录 引言 一、迁移学习概述 1.1 迁移学习的类型 1.2 迁移学习的核心思想 1.3 迁移学习的应用场景 二、领域自适应(Domain Adaptation) 2.1 领域自适应的定义 2.2 领域自适应的挑战 2.3 领域自适应的核心方法 &#…...
WebRTC与PJSIP:呼叫中心系统技术选型指南
助力企业构建高效、灵活的通信解决方案 在数字化时代,呼叫中心系统的技术选型直接影响客户服务效率和业务扩展能力。WebRTC与PJSIP作为两大主流通信技术,各有其核心优势与适用场景。本文从功能、成本、开发门槛等维度为您深度解析,助您精准匹…...
使用IDEA如何隐藏文件或文件夹
选择file -> settings 选择Editor -> File Types ->Ignored Files and Folders (忽略文件和目录) 点击号就可以指定想要隐藏的文件或文件夹...
【人工智能】数据挖掘与应用题库(1-100)
1、涉及变化快慢的问题可以考虑使用导数来分析。 答案:对 2、导数的几何意义是曲线在某点处切线的斜率。 答案:对 3、函数在某点的左导数存在,则导数就存在。 答案:错 4、关于梯度下降算法,下列说法错误的是( ) 错误:梯度下降算法能找到函数精确的最小值。 5、正…...
腾讯云大模型知识引擎驱动的DeepSeek满血版医疗顾问大模型搭建实战
文章目录 1. 引言2. 什么是腾讯云大模型知识引擎(LKE)?核心优势功能特点应用场景 3. 模型搭建过程3.1 注册登录产品3.2 创建应用3.3 配置模型3.4 配置角色指令3.5 配置欢迎语3.6 配置知识库3.7 配置工作流3.8 启用联网搜索3.9 发布模型 4. 问…...
大白话页面加载速度优化的工具与实践案例
大白话页面加载速度优化的工具与实践案例 优化工具 Chrome开发者工具:这是个超好用的浏览器自带工具。就像你给车做检查的一套工具一样,能帮你查看页面加载的各种情况。比如说,你能在“Network”(网络)选项里看到每个…...
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解。
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解 在 Java 面试中,面向对象 是一个高频考点。它不仅是一种编程思想,更是现代软件开发的核心方法论。本文将从 面向对象的概念、与面向过程的对比、以及 面向对象的三大特性(封…...
解锁责任链模式:Java 实战与应用探秘
系列文章目录 后续补充~~~ 文章目录 一、责任链模式基础入门1.1 责任链模式的定义1.2 核心角色剖析1.2.1 抽象处理者(Handler)1.2.2 具体处理者(ConcreteHandler)1.2.3 客户端(Client) 1.3 类图结构展示 二…...
华为 Open Gauss 数据库在 Spring Boot 中使用 Flyway
db-migration:Flyway、Liquibase 扩展支持达梦(DM)、南大通用(GBase 8s)、OpenGauss 等国产数据库。部分数据库直接支持 Flowable 工作流。 开源代码仓库 Github:https://github.com/mengweijin/db-migrat…...
汽车电子电控软件开发中因复杂度提升导致的架构恶化问题
针对汽车电子电控软件开发中因复杂度提升导致的架构恶化问题,建议从以下方向进行架构优化和开发流程升级,以提升灵活性、可维护性和扩展性: 一、架构设计与模块化优化 分层架构与模块解耦 采用AUTOSAR标准的分层架构(应用层、运行…...
VMware Ubuntu 共享目录
在VMware中挂载Ubuntu共享目录需要以下步骤,分为设置共享文件夹和在Ubuntu中挂载两部分: 一、VMware 设置共享文件夹 关闭Ubuntu虚拟机 在配置前,建议先关闭虚拟机(若已运行需关闭,部分VMware版本支持热添加࿰…...
Linux安装jdk,node,mysql,redis
准备工作: 1.安装VMware软件,下载CentOs7镜像文件,在VMware安装CentOs7 2.宿主机安装Xshell用来操作linux 3. .宿主机安装Xftp用来在宿主机和虚拟机的linux传输文件 案例1:在 /home/soft文件夹解压缩jdk17,并配置环…...
Excel工作圈小工具一个集合了大量Excel功能的绿色工具软件
Excel工作圈小工具 一个集合了大量Excel功能的绿色工具软件,可以大大加强生产效率~ 软件虽然看起来比较简陋,但功能却是十分丰富。无需联网即可运行,而且兼容WPS和MS office各版本。 以下是软件的功能详细截图。 总的来说功能挺丰富&#…...
DeepSeek实操教程(清华、北大)
文末清华大学及北京大学DeepSeek下载地址 1. 地址 2. 提示词 模板:我要(做)xxx,要给xxx用,希望达到xxx效果,但担心xxx问题 3. 软件联动 基本原则:Deepseek生成内容,以其它软件…...
模拟退火算法浅尝
简介 其是模拟物理退火过程而演升出的算法,物理退火过程包含加温过程,等温过程,冷却过程。 模拟退火(SA) 初始设定为高温状态,看作是在解空间进行广域搜,处于低温状态时,看作是在解空间中作局部领域搜索…...
夸克扫码登录
kefu16665...
工程师必备:高效阅读Datasheet的实用技巧
1. 为什么工程师必须掌握Datasheet阅读能力在嵌入式系统和硬件开发领域,Datasheet(数据手册)就是芯片的"使用说明书"。我从业十余年,见过太多工程师因为不会正确阅读Datasheet而踩坑的案例。有一次团队花了两个月调试一…...
政务行业高准确率、可控、符合规范的数据库审计与监测实践方案
一、概要:以高精准风险监测与全链路审计,构筑政务数据安全可控防线在国家数字化治理体系纵深推进的背景下,政务数据已成为驱动政府决策、公共服务与社会管理的关键生产要素。然而,随着政务云、数据共享交换平台的大规模建设&#…...
GRS认证实操干货:TC交易证书全流程解析(源头供应商必看)
一、前言:GRS证书与TC的核心关联(新手必懂)在再生行业GRS认证体系中,多数源头供应商存在一个核心认知误区:认为拿到GRS范围证书(SC)就完成了合规闭环,实则不然。GRS证书(…...
用户智能体交互协议AG-UI(上)
三大Agent协议对比 我们之前已经学习了MCP 和 A2A两个重要的协议了,加上AG-UI,它们共同组成了Agent的三大通信协议体系。 不过,它们的定位各有侧重,并非非此即彼,而是协同使用,用形象的比喻来讲ÿ…...
Elsevier Tracker:学术审稿状态自动化追踪解决方案
Elsevier Tracker:学术审稿状态自动化追踪解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker Elsevier Tracker是一款开源Chrome插件,专为学术研究者设计,提供Elsevier期刊审…...
嘎嘎降AI和去AIGC哪个更适合文科论文?深度对比评测
嘎嘎降AI和去AIGC哪个更适合文科论文?深度对比评测 选降AI工具看三点:达标率、价格、处理后文本质量。 按这标准我花了一周研究主流工具。结论先说:嘎嘎降AI(www.aigcleaner.com)最适合大多数人——4.8元一篇&#x…...
kmp算法(完结)
1.重复的子字符串 class Solution { public:void getNext(vector<int> &next,const string s){int j0;next[j]0;for(int i1;i<s.size();i){while(j-1>0&&s[i]!s[j]){jnext[j-1];}if(s[i]s[j]){j;next[i]j;}else{next[i]0;}}}bool repeatedSubstringPa…...
解锁5大核心能力:BetterJoy让Switch手柄在PC实现专业级控制
解锁5大核心能力:BetterJoy让Switch手柄在PC实现专业级控制 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode…...
Qwen3-32B部署全攻略:3步搞定,零基础也能快速上手
Qwen3-32B部署全攻略:3步搞定,零基础也能快速上手 1. 为什么选择Qwen3-32B? Qwen3-32B是当前开源大模型领域的佼佼者,拥有320亿参数的强大能力。与市面上其他模型相比,它有三个突出优势: 推理能力卓越&a…...
