[Effective C++]条款25:考虑写出一个不抛异常的swap函数

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由 版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建... 阅读详情

.
1、std::swap

  • 在C++中,std::swap是标准模板库STL中的一个函数模板,用于交换两个对象的值。他的默认实现是通过三次拷贝操作来完成的。
  • 这种实现对于大多数类型来说足够的,也保证了异常安全性。然而,当交换的对象包含指针时,实现可能会导致不必要的性能开销,因为它会复制指针所指向的数据,而不仅仅是复制指针本身。
template<typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

2、自定义swap成员函数

  • 当类中包含指针对象时,为了避免std::swap函数调用的不必要性能开销,为class类自定义一个swap的成员函数,该函数只交换指针,而不赋值指针所指向的数据
class MyClass {
public:
    MyClass() : data(new int(0)) {}
    ~MyClass() { delete data; }

    // 自定义 swap 成员函数
    void swap(MyClass& other) noexcept {
        std::swap(data, other.data);
    }

    // 其他成员函数...

private:
    int* data;
};

3、非成员函数的swap

  • 为了与STL的std::swap兼容,并且让其他代码能够方便地使用自定义的swap函数,在非成员函数的swap中,会调用类的swap成员函数
    // 非成员函数的 swap
void swap(MyClass& a, MyClass& b) noexcept {
    a.swap(b);
}
  • 完整代码示例
#include <iostream>
#include <utility> // for std::swap

class MyClass {
public:
    MyClass() : data(new int(0)) {}
    MyClass(int value) : data(new int(value)) {}
    ~MyClass() { delete data; }

    // 自定义 swap 成员函数
    void swap(MyClass& other) noexcept {
        std::swap(data, other.data);
    }

    // 获取数据的值
    int getValue() const { return *data; }

    // 其他成员函数...

private:
    int* data;
};

// 非成员函数的 swap
void swap(MyClass& a, MyClass& b) noexcept {
    a.swap(b);
}

int main() {
    MyClass a(10);
    MyClass b(20);

    std::cout << "Before swap: a = " << a.getValue() << ", b = " << b.getValue() << std::endl;

    // 使用自定义的 swap 函数
    swap(a, b);

    std::cout << "After swap: a = " << a.getValue() << ", b = " << b.getValue() << std::endl;

    return 0;
}

思维导图笔记:
请添加图片描述

VSCode + QMT 量化交易完整解决方案! 🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。 阅读详情

相关推荐

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1262

Item25:考虑写出一个不抛异常的swap函数

当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常。 如果提供一个member swap,也该提供一个non-member swap用来调用前者。对于classes (而非templates),请特化std::swap。 调用swap时应针对std::swap使用using声明式,然后就可以直接调用swap。 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些新东西。

jdududu的博客 176

海康摄像头V3.4 升级改造VUE3

摘要:本文介绍了一个基于Vue3的海康威视摄像头组件封装方案。针对官方仅提供HTML版本SDK的问题,作者通过封装实现了Vue3组件化集成,解决了iframe/webview引入方式的弊端。组件核心功能包括实时预览、本地录像、录像下载、截图抓拍等,并优化了SDK初始化逻辑(单例模式)、定位问题修复和错误处理机制。关键技术点包括:1)SDK插件容器定位修复;2)录像下载进度监控;3)多格式图片数据处理;4)多窗口场景下的SDK实例管理。该组件可直接通过npm安装使用,提供了完善的API和事件接口,显著提升了海

LINLINLINShi的博客 113

Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数

【代码】Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数。

weixin_42255569的博客 587

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似

jiangxing11的博客 1万+

gem5 run parsec2.1 ---- 亲测跑通教程

使用gem5模拟仿真parsec2.1,排除了各种bug,成功跑通,亲测有效!!!

m0_55539563的博客 1546

《Effective C++》item25:考虑写出一个不抛异常的swap函数

std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: [cpp] view plaincopyprint? int main(int argc, _TCHAR* argv[])   {       int a[10] = {1,2,3,4,

onejune的博客 1621

告别理论!用AXI-Stream实战摄像头数据流采集(附Verilog关键代码片段)

本文详细解析了如何通过AXI-Stream接口实现工业级可靠性的摄像头数据流采集系统,重点介绍了Verilog实战代码、AXI-Stream握手机制及数据反压处理方案。通过三级缓冲架构和带宽优化,有效解决了OV5640等摄像头在高速场景下的帧丢失问题,为FPGA图像处理项目提供了实用解决方案。

weixin_42563415的博客 157

条款25:考虑写出一个不抛异常的swap函数(Consider support for a non-throwing swap)

Effective C++之条款25

weixin_43739503的博客 426

修改 Alist 密码时报错?看看这个坑怎么解决!

启动服务后,再修改密码”。以后再遇到类似问题,先检查服务是否正常运行,说不定就能少踩不少坑。如果还有其他 Alist 的问题,欢迎在评论区留言交流~

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1154

OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备

OmniParser V2 和 OmniTool 是由微软开发的一套工具,通过屏幕解析技术让 AI 能够理解和控制 Windows 设备。OmniParser V2 是一款数据解析工具,可以解读屏幕内容,并将内容传递给大模型OmniTool 则是一个运行 Windows Agent 的工具,提供 Windows 界面给 AI 操作。

简简单单Onlinezuozuo 2731

Effective C++ 条款25_考虑写出一个不抛异常的 swap 函数_不止于此

Consider support for a non-throwing swap swap 是个有趣的函数。原本它只是 STL 的一部分,而后成为异常安全性编程的脊柱,以及用来处理自我赋值可能性(见条款 11)的一个常见机制。由于 swap 如此有用,适当的实现很重要。然而在非凡的重要性之外它也带来了非凡的复杂度。本条款探讨这些复杂度及因应之道。 所谓 swap (置换)两对象值,意思是将两对象的值彼此赋予对方。缺省情况下 swap 动作可由标准程序库提供的 swap 算法完成: namespace std

嘟嘟的博客 282

信息传输仿真:卫星通信系统仿真_(12).基于SystemVue的卫星通信仿真

SystemVue是Cadence公司开发的一款用于系统级设计和仿真的软件工具。它主要用于无线通信系统的设计和验证,特别是在卫星通信、雷达、射频和微波通信等领域。SystemVue提供了一个集成的环境,用户可以通过拖拽和连接各种预定义的模块来构建复杂的通信系统模型,从而进行性能分析和优化。

2401_87715305的博客 1370

[Effective C++]条款25 考虑写出一个不抛异常的swap函数

swap是一个有趣的函数, 原本它只是STL的一部分, 而后成为了异常安全性编程中的脊柱, 有关异常安全性我在条款11中介绍过, 在之后的条款29中也将着重着墨. 由于swap相当有用, 适当的实现非常重要, 好的swap设计可以带来非凡的效率提升, 本条款将着重描写如何写一个合格的swap函数.

tianmu_sama的博客 724

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Effective C++ 学习笔记 条款25 考虑写出一个不抛异常的swap函数

因此当你写下一个自定版本的swap,往往提供的不只是高效置换对象值的办法,而且不抛出异常(因为调用的是成员版的swap)。不幸的是有一个理由使你应该为class特化std::swap(很快会描述它),所以如果你想让你的“class专属版”swap在尽可能多的语境下被调用,你需得同时在该class所在命名空间内写一个non-member版本以及一个std::swap特化版本。首先,如果swap的缺省实现码对你的class或class template提供可接受的效率,你不需要额外做任何事。

tus00000的博客 837

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Effective C++ 条款25:考虑写出一个不抛异常的swap函数

Effective_C++_25

君鼎的博客 364

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Effective C++条款25:设计与声明——考虑写出一个不抛异常的swap函数

一、标准模板库中的swap函数 标准模板库中的swap函数,其是STL中的一部分,后来成为异常安全性编程(见条款29)以及用来处理自我赋值可能性(见条款11)的一个常见机制 下面是STL中swap的源码:只要类型T支持拷贝(拷贝构造函数或者拷贝赋值运算符),缺省的swap函数就可能帮你对两个类型为T的对象进行兑换 为什么不使用std::swap()函数: 从源码可以看出,std::swap函数,其涉及三个对象的复制操作:a复制到temp,b复制到a,temp复制到b 但是对于我们自己设计的类

www_dong的博客 327

Effective C++条款25:考虑写出一个不抛异常的swap函数

在默认情况下swap可由标准程序库提供的swap算法完成,典型的实现如下: template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; } 考虑以下的类: class Person { private: int age; string name; public: ... ...

qq_44800780的博客 246

Effective C++条款25:设计与声明之(考虑写出一个不抛异常的swap函数)

待续

董哥的黑板报 1042

《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对象数值的功能,还可以用来实现异常安全的赋值,避免自赋值(见条款11)等等用途。在std标准库里,swap函数就是这样实现的: namespace std{ template<typename T> void swap(T& a, T& b) { T temp

ZLX的博客 557

《Effective C++》条款25:考虑写出一个不抛异常的swap函数

swap是两个元素交换的函数,在STL中也有对应的实现,其基本实现为:namespace std{ template<typename T> void swap(T& a, T& b){ T temp(a); a = b; b = temp; } }这个置换方式和大多数人想象的一样,它涉及到三个对象的复制: a复制到temp

脱离了低级趣味的流氓 351

Effective C++条款25:考虑写出一个不抛异常的swap函数(Consider support for a non-throwing swap)

Effective C++条款25:考虑写出一个不抛异常的swap函数(Consider support for a non-throwing swap)

CltCj的博客 578

Effective C++:条款25:考虑写出一个不抛异常的swap函数

(一) 缺省情况下swap动作可由标准程序库提供的swap算法完成: namespace std { template void swap(T& a, T& b) { T temp(a); a = b; b = temp; } }这个函数是异常安全性编程的核心,并且是用来处理自我赋值可能性的一个常见机

u010470972的专栏 1085

《Effective C++》学习笔记条款25 考虑写出一个不抛异常的swap函数

考虑写出一个不抛异常的swap函数

UE引擎开发工程师 1106

读书笔记《Effective C++》条款25:考虑写出一个不抛异常的swap函数

所谓swap(置换)两对象值,意思是将两对象的值彼此赋予对方。缺省情况下swap动作可有标准程序库提供的swap算法完成。 namespace std { template void swap(T& a, T& b) { T temp(a); a = b; b = temp; } } 只要类型T支持copying(copy构造函数和copy assignment操作符),缺

Do-Program的专栏 303

Effective C++条款25:考虑写出一个不抛异常的swap函数

待续:等比较熟悉template编程后再来看这里

zion--6135的博客 131
上一篇: [Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数
下一篇: [Effective C++]条款26:尽可能延后变量定义的出现时间
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值