C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。

这条法则强调了使用"拷贝和交换"(Copy-and-Swap)惯用法来实现赋值运算符(=)的优点:

关键点

  1. 异常安全:拷贝和交换方法天然提供了强异常安全保证,因为在修改左侧对象之前,所有操作都已完成。

  2. 自赋值安全:这种方法自动正确处理自赋值情况(如x = x),不需要显式检查。

  3. 代码复用:它利用了拷贝构造函数和swap函数的已有实现,避免了代码重复。

典型实现

(1)

    //注意rhs是按值传递的,意味着HasPtr持拷贝构造函数//将右侧运算符对象中的string拷贝到rhsHasPtr& HasPtr::operator=(HasPtr rhs){//交换左侧运算对象和局部变量rhs的内容swap(*this,rhs); //rhs现在是指向本对象曾经使用的内存return *this; //rhs被销毁,从而delete了rhs中的指针}


(2)

​​​​​​​class MyClass {
public:// 拷贝赋值运算符MyClass& operator=(MyClass other) { // 注意:参数是按值传递swap(*this, other);return *this;}// 交换函数friend void swap(MyClass& first, MyClass& second) noexcept {using std::swap;// 交换所有成员swap(first.data, second.data);// ... 其他成员的交换}
};

工作原理

  1. 参数是按值传递的,这会调用拷贝构造函数创建临时副本

  2. 然后与当前对象交换内容

  3. 临时对象在函数结束时销毁,带走原内容

优势

  • 简洁且不易出错

  • 自动获得异常安全性

  • 正确处理自赋值

  • 与移动语义自然配合(C++11及以上)

这种方法遵循了DRY(Don't Repeat Yourself)原则,减少了代码重复和潜在错误。

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

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

相关文章

纯血HarmonyOS5 打造小游戏实践:扫雷(附源文件)

鸿蒙扫雷游戏的核心架构设计 鸿蒙OS扫雷游戏采用了MVC(模型-视图-控制器)的架构思想,将游戏逻辑与UI展示分离,使得代码结构清晰且易于维护。整个游戏由以下几个核心部分构成: 数据模型设计 游戏的基础数据模型是Cel…

Linux C语言的opendir如何获取目录下的隐藏文件

在 Linux 文件系统中,所谓隐藏文件是文件名以 . 开头的文件(例如 .bashrc、.git、.config 等)。 在编程层面,opendir readdir 并不会自动排除隐藏文件。 只要你不在代码中手动过滤,readdir 会把目录下所有文件&#…

母线槽接头过热隐患难防?在线测温方案实时守护电力安全

近年来,由于各种设备对电力的大力需求,并有逐年增加的趋势,传统电路接线方式在施工时越来越力不从心。系统一旦定型,后续想要简化变更更是难上加难。母线槽方案因此兴起,凭借多点连接(接头、插接头、插接箱…

Windows本地部署wordpress

一、下载wordpress 地址:Download – WordPress.org 下载后解压出来 二、下载小皮面板 地址:Windows版phpstudy下载 - 小皮面板(phpstudy) 下载后安装 三、打开小皮面板,安装对应内置应用 1、MySQL8(注意要是8版本,卸载其他版本…

Android 性能优化

一、Android中检测性能工具 Profiler —— 使用Profiler的CPU分析功能。 Method Tracing ———— 通过该方法,我们可以记录应用运行过程中的方法调用情况,包括每个方法的执行时间、调用次数等。 Systrace 是Android平台提供的一款工具,用于记录短期内的设备活动。 Systra…

图片压缩工具 | Electron应用配合 commander 提供命令行调用功能

OPEN-IMAGE-TINY,一个基于 Electron VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny 功能描述 应用程序的命令行调用功能允许用户通过终端(如Windows的CMD/PowerShell或Linux/macOS的Terminal&am…

Linux》》Shell脚本 基本语法

执行脚本的三种方式 查找变量的过程 变量引用的顺序》》先从当前进程查询变量,如果当前进程没有此变量,默认去父进程查找这个变量。如果查找到则返回,否则一直查找到 祖宗(PID为1),还没有,则就…

C#.VB.NET多线程,多用户下独立锁和全局锁的区别

以下代码,每个客户端都分配了一个锁吗? 用户WebSocket信息类Public Class UserWebSocketInfoPublic Property SessionID As StringPublic Property WebSocket As WebSocketPublic Property LastResponseTime As DateTimePublic Property PendingHeartbeatCount As IntegerPubl…

无人机加速器模块技术解析

一、加速器模块的运行方式 1. 传感器数据采集与融合 加速度计核心作用:测量三维线性加速度(X/Y/Z轴),结合陀螺仪(角速度)和磁力计(方向)构成九轴姿态传感器,实时输出…

用html实现数字生命

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>数学粒子动画</title><style>body {mar…

SQLite3 在嵌入式系统中的应用指南

SQLite3 在嵌入式系统中的应用指南 一、嵌入式系统中 SQLite3 的优势 SQLite3 是嵌入式系统的理想数据库解决方案&#xff0c;具有以下核心优势&#xff1a; 特性嵌入式系统价值典型指标轻量级适合资源受限环境库大小&#xff1a;500-700KB零配置无需数据库管理员开箱即用无…

通义大模型与现有企业系统集成实战《CRM案例分析与安全最佳实践》

1. 集成架构设计 &#xff08;1&#xff09;混合部署架构演进 #mermaid-svg-eW4YPoU2fdbnT4xp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eW4YPoU2fdbnT4xp .error-icon{fill:#552222;}#mermaid-svg-eW4YPoU2f…

leetcode:746. 使用最小花费爬楼梯

学习要点 动态规划正着推动态规划倒着推理解递归在动态规划与纯递归的类比分析中体会两者各自的特点 题目链接 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法1&#xff1a;动态规划倒着推 // dp[i]--->从第i阶楼梯到达楼顶最小花费int…

汽车毫米波雷达增强感知:基于相干扩展和高级 IAA 的超分辨率距离和角度估计.

重庆西南大学毫米波雷达团队在IEEE Transactions on Consumer Electronics 上发表的一篇论文&#xff1a;《基于相干扩展和高级 IAA 的超分辨率距离和角度估计》。 本文深入研究了毫米波&#xff08;mmWave&#xff09;调频连续波雷达距离和角度的超分辨问题。首先&#xff0c;…

软件更新 | 从数据到模型,全面升级!TSMaster新版助力汽车研发新突破

为满足汽车电子开发领域日益增长的测试与仿真需求&#xff0c;TSMaster最新版本聚焦实车数据采集、MBD智能建模与新API扩展三大核心功能。无论您是进行车载网络测试、ECU开发还是自动化验证&#xff0c;新版本都能为您提供更高效、更可靠的解决方案&#xff01; TSMaster 2025.…

PDF-XSS

前言&#xff1a; PDF文件是一种复杂的文档格式&#xff0c;由一系列对象组成&#xff0c;包括字体、图像、页面内容等。PDF文件支持嵌入JavaScript代码&#xff0c;这使得PDF文件不仅可以显示静态内容&#xff0c;还可以执行动态操作。这种特性被攻击者利用来嵌入恶意脚本代码…

MySQL 表关联关系详解

MySQL 表关联关系详解 本文档详细列举了MySQL中常见的表关联关系场景以及对应的SQL语句示例。 1. 一对一关系 (One-to-One) 场景&#xff1a;用户表和用户详情表 一个用户对应一个用户详情通常用于将大表拆分&#xff0c;提高查询性能 -- 创建用户表 CREATE TABLE users (…

kubernetes(k8s)集群部署(超详细)

k8s部署 kubernetes集群图例kubernetes 安装仓库初始化1、创建云主机2、初始化私有仓库kube-master安装1、防火墙相关配置2、配置yum仓库(跳板机)3、安装软件包(master)4、镜像导入私有仓库5、Tab键设置6、安装代理软件包7、配置内核参数8、使用kubeadm部署9、验证安装结果计算…

「Flink」算子主要方法介绍

背景&#xff1a; 上期文章主要讲了Flink项目搭建的一些方法&#xff0c;其中对于数据流的处理很大一部分是通过算子来进行计算和处理的&#xff0c;算子也是Flink中功能非常庞大&#xff0c;且很重要的一部分。 算子介绍&#xff1a; 算子在Flink的开发者文档中是这样介绍的…

3405. 统计恰好有 K 个相等相邻元素的数组数目

3405. 统计恰好有 K 个相等相邻元素的数组数目 给你三个整数 n &#xff0c;m &#xff0c;k 。长度为 n 的 好数组 arr 定义如下&#xff1a; arr 中每个元素都在 闭 区间 [1, m] 中。恰好 有 k 个下标 i &#xff08;其中 1 < i < n&#xff09;满足 arr[i - 1] arr…