编程参考 - Rule of Three and the Rule of Five in C++

C++ 中的 "三规则 "和 "五规则 "是管理类中资源管理函数(特殊成员函数)的准则。这些规则有助于确保类正确一致地管理动态内存、文件句柄或网络连接等资源。

The Rule of Three and the Rule of Five in C++ are guidelines for managing the resource management functions (special member functions) in a class. These rules help ensure that classes manage resources like dynamic memory, file handles, or network connections correctly and consistently.

Rule of Three

"三原则"指出,如果一个类定义了以下内容之一,那么它可能应该明确定义所有三项内容:

The Rule of Three states that if a class defines one of the following, it should probably explicitly define all three:

1, Destructor

2, Copy Constructor

3, Copy Assignment Operator

之所以会出现这条规则,是因为如果一个类管理一个资源(如动态内存),编译器提供的这些函数的默认实现可能无法正确处理该资源,从而导致重复删除或资源泄漏等问题。

This rule arises because if a class manages a resource (like dynamic memory), the default implementations of these functions provided by the compiler might not handle the resource correctly, leading to issues like double deletion or resource leaks.

Example:

#include <iostream>

class RuleOfThree {

private:

    int* data;

public:

    RuleOfThree(int value) : data(new int(value)) {}

    ~RuleOfThree() {

        delete data;

    }

    // Copy constructor

    RuleOfThree(const RuleOfThree& other) : data(new int(*other.data)) {}

    // Copy assignment operator

    RuleOfThree& operator=(const RuleOfThree& other) {

        if (this == &other) {

            return *this;

        }

        delete data;

        data = new int(*other.data);

        return *this;

    }

};

Rule of Five

随着 C++11 的推出,移动语义被添加到语言中,并由此产生了 "五法则"。五规则扩展了三规则,将移动操作也包括在内:

With the introduction of C++11, move semantics were added to the language, which led to the Rule of Five. The Rule of Five extends the Rule of Three to include move operations:

1, Destructor

2, Copy Constructor

3, Copy Assignment Operator

4, Move Constructor

5, Move Assignment Operator

对于管理资源的类来说,移动操作是必要的,因为它可以从临时对象中有效地转移资源,避免不必要的深度拷贝。

Move operations are necessary for classes that manage resources because they allow efficient transfer of resources from temporary objects, avoiding unnecessary deep copies.

Example:

#include <iostream>

class RuleOfFive {

private:

    int* data;

public:

    RuleOfFive(int value) : data(new int(value)) {}

    ~RuleOfFive() {

        delete data;

    }

    // Copy constructor

    RuleOfFive(const RuleOfFive& other) : data(new int(*other.data)) {}

    // Copy assignment operator

    RuleOfFive& operator=(const RuleOfFive& other) {

        if (this == &other) {

            return *this;

        }

        delete data;

        data = new int(*other.data);

        return *this;

    }

    // Move constructor

    RuleOfFive(RuleOfFive&& other) noexcept : data(other.data) {

        other.data = nullptr;

    }

    // Move assignment operator

    RuleOfFive& operator=(RuleOfFive&& other) noexcept {

        if (this == &other) {

            return *this;

        }

        delete data;

        data = other.data;

        other.data = nullptr;

        return *this;

    }

};

Summary

  • 三原则: 如果你定义了析构函数、复制构造函数或复制赋值操作符中的任何一种,你可能应该定义所有三种。

  • 五条规则: 在 C++11 中增加了移动语义后,如果您定义了析构函数、复制构造函数、复制赋值操作符、移动构造函数或移动赋值操作符中的任何一种,则应定义所有五种。

这些规则有助于确保您的类正确管理其资源,避免资源泄露、重复删除和低效深度拷贝等问题。

  • Rule of Three: If you define any of the destructor, copy constructor, or copy assignment operator, you should probably define all three.

  • Rule of Five: With the addition of move semantics in C++11, if you define any of the destructor, copy constructor, copy assignment operator, move constructor, or move assignment operator, you should define all five.

These rules help ensure that your class correctly manages its resources, avoiding issues like resource leaks, double deletions, and inefficient deep copies.

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

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

相关文章

【C++题解】1168. 歌唱比赛评分

问题&#xff1a;1168. 歌唱比赛评分 类型&#xff1a;数组找数 题目描述&#xff1a; 四&#xff08;1&#xff09; 班要举行一次歌唱比赛&#xff0c;以选拔更好的苗子参加校的歌唱比赛。评分办法如下&#xff1a;设 N 个评委&#xff0c;打 N 个分数&#xff08; 0≤每个分…

Linux C语言基础 day10

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.指针指向数组 1.1 指针与数组的关系 1.2 指针与一维数组关系实现 1.2.1 指针与一维数组的关系 1.2.2 指针指向一维整型数组作为函数参数传递 课外作业&#xff1a; 学习目标&#xff1a; 一周掌握 C基础知识 学习内…

卡码网语言基础课 | 10. 平均绩点

目录 1、问题描述2、知识点① 字符串格式化输出② 保留小数 3、代码 1、问题描述 题目描述&#xff1a;每门课的成绩分为A、B、C、D、F五个等级&#xff0c;为了计算平均绩点&#xff0c;规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。 输入描述&#xff1a;有多组测试…

RandomAccessFile详细总结

RandomAccessFile 是 Java 中一个非常特殊的类&#xff0c;它既可以用来读取文件&#xff0c;也可以用来写入文件。与其他 IO 类&#xff08;如 FileInputStream 和 FileOutputStream&#xff09;不同&#xff0c;RandomAccessFile 允许您跳转到文件的任何位置&#xff0c;从那…

【全面介绍Pip换源】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子&#xff0c;ONNX内部没有&#xff0c;那么需要自己去实现。 1.1 配置环境 安装ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…

基于Java的斗地主游戏案例开发(做牌、洗牌、发牌、看牌

package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//♥3 ♣3static ArrayList<String> list new ArrayList<>();//静态代码块//特点&#xff1a;随着类的加载而在加载的&#xff0c;而且只执行一次。stat…

底软驱动 | C++内存相关

文章目录 C内存相关C内存分区C对象的成员函数存放在内存哪里 堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C内存泄漏的几种情况内存对齐柔性数组参考推荐阅读 C内存相关 本篇介绍了 C 内存相关的知识。 C内存分区 在C中&#…

力扣第八题——字符串转换整数

题目介绍 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数。 函数 myAtoi(string s) 的算法如下&#xff1a; 空格&#xff1a;读入字符串并丢弃无用的前导空格&#xff08;" "&#xff09;符号&#xff1a;检查下一个字…

TCP重传、滑动窗口、流量控制、拥塞控制机制

目录 1、TCP重传机制超时重传快速重传 2、滑动窗口3、流量控制4、拥塞控制1、慢启动2、拥塞避免3、拥塞发生 1、TCP重传机制 TCP 针对数据包丢失的情况&#xff0c;会用重传机制解决。 超时重传 就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间还没…

Ctrl+C、Ctrl+V、Ctrl+X 和 Ctrl+Z 的起源

注&#xff1a;机翻&#xff0c;未校对。 The Origins of CtrlC, CtrlV, CtrlX, and CtrlZ Explained We use them dozens of times a day: The CtrlZ, CtrlX, CtrlC, and CtrlV shortcuts that trigger Undo, Cut, Copy, and Paste. But where did they come from, and why do…

文件上传接口

文章目录 开发前端接口 开发前端接口 首先这个前端的文件上传组件使用了,前端组件 首先这个接口不是一般的接口,这个接口可以提取出来,之后那里使用了,就直接放到哪里 所以这是一个万能文件上传接口 写完之后选择 头像组件 在图库中添加组件 写前端组件之后,写了前端的组件…

Bootstrap 5 加载效果

Bootstrap 5 加载效果 Bootstrap 5 是一个流行的前端框架,它提供了丰富的组件和工具,用于快速开发响应式和移动优先的网页。在本文中,我们将探讨 Bootstrap 5 中的加载效果,包括如何实现它们以及它们在网页设计中的作用。 什么是加载效果? 加载效果是在网页或应用程序中…

k8s集群创建devops项目一直等待状态,没有发现host

问题分析&#xff1a; kubesphere在帮我们自动化创建一些智能自动化的额时候难免会发生一些小错误&#xff0c;devops-jenkins是一个部署也会生成一个容器组即pod&#xff0c;容器组的容器服务端口是 targetPort&#xff0c;容器组对外暴露的端口是port&#xff0c;拿devops-c…

[深度学习]基于yolov10+streamlit目标检测演示系统设计

YOLOv10结合Streamlit构建的目标检测系统&#xff0c;不仅极大地增强了实时目标识别的能力&#xff0c;还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法&#xff0c;能够快速准确地识别图像中的多个对象&#xff0c;并标注…

Billu_b0x靶机

信息收集 使用arp-scan 生成网络接口地址来查看ip 输入命令&#xff1a; arp-scan -l 可以查看到我们的目标ip为192.168.187.153 nmap扫描端口开放 输入命令&#xff1a; nmap -min-rate 10000 -p- 192.168.187.153 可以看到开放2个端口 nmap扫描端口信息 输入命令&…

配置PYTHONPATH环境变量

配置PYTHONPATH环境变量 前言Win系统临时配置永久配置 Linux系统临时配置永久配置 前言 在运行py脚本时不仅需要import官方库&#xff0c;经常会import自己编写的脚本&#xff0c;但此时会出现模块找不到的如下报错。解决方法是配置PYTHONPATH&#xff0c;下文介绍Win系统和Li…

禹神:一小时快速上手Electron,前端Electron开发教程,笔记。一篇文章入门Electron

一、Electron是什么 简单的一句话&#xff0c;就是用htmlcssjsnodejs&#xff08;Native Api&#xff09;做兼容多个系统&#xff08;Windows、Linux、Mac&#xff09;的软件。 官网解释如下(有点像绕口令)&#xff1a; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面…

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load从Assets下的任意Resources目录下读取资源&#xff0c;比如从Assets\Resources下读取Cube&#xff08;预制体&#xff09;&#xff0c;当然也可以读取其他资源 代码为 GameObject prefab Resources.Load<GameObject>(…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来&#xff0c;微软Edge浏览器作为默认的网页浏览器&#xff0c;凭借其现代化的设计和出色的性能表现&#xff0c;逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析&#xff0c;探讨其在多个方面的表现。 二、界面与操作体验 界面…