1. 类对象的交换赋值

Hasptr.h

class Hasptr
{public: Hasptr(const std::string &s = std::string()):ps(new std::string(s),i(0),use(new std::size_t(1)))   {} Hasptr(const Hasptr &p):ps(p.ps),i(p.i),use(p.use){++*use}; Hasptr& operator=(const Hasptr&);~Hasptr();
private:std::string *ps;int i;std::size_t *use;
}

交换代码为:

Hasptr temp = v1;   //创建v1的一个临时副本
v1 = v2;        //将v2赋值给v1
v2 =temp;      //将保存v1的值赋予v2

2. 优化

在上面的交换过程中,需要一次拷贝和两次赋值,string的内存分配带来了开销, 更希望 swap 交换指针,而不是分配 string 的新副本:

string &temp = v1.ps;
v1.ps = v2.ps;
v2.ps = temp.ps;

2. 1 可以在类上自定义一个版本的 swap,当交换两个HasPtr对象时,只需要交换他们内部的指针即可:

class HasPtr{friend void swap(HasPtr &lhs,HasPtr &rhs);
}inline swap(HasPtr&,HasPtr&)
{using std::swap;swap(lhs.ps,rhs.ps);   //交换指针,而不是string的数据swap(lhs.i;rhs.i);            //交换int成员
}

2. 2 赋值运算符中使用 swap

使用拷贝并交换的技术,这种技术将左侧运算对象与右侧运算对象的一个副本进行交换。
rhs 是按值传递的:

HasPtr& HasPtr::operator=(HasPtr rhs)
{//交换左侧运算对象和局部变量rhs的内容swap(*this,rhs);return *this; //rhs 被销毁,从而delete了rhs中的指针
}
  • 注:赋值运算符具备异常安全、且能正确处理自赋值。

【参考】
[1] 代码referenceCountSwap.h

C++ Primer 5th笔记(chap 13 拷贝控制)交换操作相关推荐

  1. C++ Primer 5th笔记(chap 13 拷贝控制)合成的移动操作

    1. 出现条件 只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个非 static 数据成员都可以移动,编译器才会为它合成构造函数或移动赋值运算符. struc X{int i;std::st ...

  2. C++ Primer 5th笔记(chap 13 拷贝控制)三五法则

    1. 三个基本操作可以控制类的拷贝操作 • 拷贝构造函数 • 拷贝赋值运算符 • 析构函数. 新标准还有2个函数: • 移动构造函数(move constructor) • 移动赋值运算符(move- ...

  3. C++ Primer 5th笔记(chap 13 拷贝控制)阻止拷贝

    对于一些类来说,拷贝操作是没有意义的,例如 iostream 类阻止了拷贝,以避免多个对象写入或读取相同的 IO 缓冲. 1. 删除函数deleted function 1.1 定义 通过在函数的参数 ...

  4. C++ Primer 5th笔记(chap 13 拷贝控制)=default

    可以将拷贝控制成员函数定义为 =default 来显示地要求编译器生成合成版本. class Sales_data{public:Sales_data() = default;Sales_data(c ...

  5. C++ Primer 5th笔记(chap 13 拷贝控制) 实例2内存管理

    1. 目标 实现标准库vector类的一个简化版本,只支持string,我们命名为StrVec. 2. 设计思想 2.1 allocator管理每个StrVec对象的内存池, 是一块连续的内存(类型为 ...

  6. C++ Primer 5th笔记(chap 13 拷贝控制)引用限定符

    1. 问题 关于右值和左值引用成员函数,通常在一个对象上调用成员函数,而不管对象是一个左值还是一个右值: string s1 = "a value",s2 = "anot ...

  7. C++ Primer 5th笔记(chap 13 拷贝控制)实例1

    1. Folder和Message的类设计 2. Messager.h class Message {friend void swap(Message&, Message&);frie ...

  8. C++ Primer 5th笔记(chap 13 拷贝控制) 对象移动

    1. 为什么要有对象移动 使用移动而非拷贝对象能够大大提升性能. 一些不能被共享的资源类的对象不能拷贝但是可以移动.eg. IO 类 unique_ptr 类 2. 如何做到对象移动 2.1 什么是右 ...

  9. C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值

    1. 移动构造函数和移动赋值运算符 一般来说,拷贝一个资源会导致一些额外的开销.在这种拷贝并非必要的情况下,定义了移动构造函数和移动赋值运算符的类就可以避免此问题. eg. StrVec::StrVe ...

最新文章

  1. 《算法基础:打开算法之门》一1.5 拓展阅读
  2. 序列化与字符流的操作
  3. datetimepicker时间控件
  4. abap判断当前月最后一个工作日_油价正式打响第一枪!今天12月3日,今晚油价迎来大幅暴跌,调价后全国地区油价一览!...
  5. oracle 增长型分区,oracle 11g 分区表创建(自动按年分区)
  6. mockjs(接口服务代理)
  7. 11-散列1 电话聊天狂人 (25 分)
  8. 论文浅尝 | 六篇2020年知识图谱预训练论文综述
  9. Maxcompute造数据-方法详解
  10. mysql排序之order by
  11. 从GCN中学习的信息熵
  12. Excel之表格斜线一分为二后输入文字
  13. 有没有测身高的手机软件?这3款App和卷尺一样精准实用
  14. 74HC595芯片应用
  15. Dreamweaver——滚动字幕制作方法总结
  16. HDU - 3174(计算几何)
  17. 如何设计登录注册模块
  18. 学猫叫用计算机歌词,抖音学猫叫是什么歌 学猫叫歌曲歌词
  19. python制作浏览器 脚本之家_基于Python打造账号共享浏览器功能
  20. swift导入oc第三方库

热门文章

  1. Python 怎么样在函数内部对全局变量进行修改
  2. 100路监控摄像头需要使用核心交换机吗?
  3. 计算机审计中级培训结业考试,第二期计算机审计中级培训班结业考.doc
  4. 计算机网络管理考核办法,开滦医院计算机网络管理考核细则
  5. ML:MLOps系列讲解之《基于ML的软件的三个层次之03 Code: Deployment Pipelines》解读
  6. DayDayUp:互联网江湖大佬那些事(互联网大佬学历一览)
  7. Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
  8. Internet:从区块链的底层技术思考互联网是如何构成的
  9. Worker Service in ASP .NET Core
  10. 拓展编辑器(五)_监听事件