C++ Primer 5th笔记(chap 13 拷贝控制)交换操作
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 拷贝控制)交换操作相关推荐
- C++ Primer 5th笔记(chap 13 拷贝控制)合成的移动操作
1. 出现条件 只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个非 static 数据成员都可以移动,编译器才会为它合成构造函数或移动赋值运算符. struc X{int i;std::st ...
- C++ Primer 5th笔记(chap 13 拷贝控制)三五法则
1. 三个基本操作可以控制类的拷贝操作 • 拷贝构造函数 • 拷贝赋值运算符 • 析构函数. 新标准还有2个函数: • 移动构造函数(move constructor) • 移动赋值运算符(move- ...
- C++ Primer 5th笔记(chap 13 拷贝控制)阻止拷贝
对于一些类来说,拷贝操作是没有意义的,例如 iostream 类阻止了拷贝,以避免多个对象写入或读取相同的 IO 缓冲. 1. 删除函数deleted function 1.1 定义 通过在函数的参数 ...
- C++ Primer 5th笔记(chap 13 拷贝控制)=default
可以将拷贝控制成员函数定义为 =default 来显示地要求编译器生成合成版本. class Sales_data{public:Sales_data() = default;Sales_data(c ...
- C++ Primer 5th笔记(chap 13 拷贝控制) 实例2内存管理
1. 目标 实现标准库vector类的一个简化版本,只支持string,我们命名为StrVec. 2. 设计思想 2.1 allocator管理每个StrVec对象的内存池, 是一块连续的内存(类型为 ...
- C++ Primer 5th笔记(chap 13 拷贝控制)引用限定符
1. 问题 关于右值和左值引用成员函数,通常在一个对象上调用成员函数,而不管对象是一个左值还是一个右值: string s1 = "a value",s2 = "anot ...
- C++ Primer 5th笔记(chap 13 拷贝控制)实例1
1. Folder和Message的类设计 2. Messager.h class Message {friend void swap(Message&, Message&);frie ...
- C++ Primer 5th笔记(chap 13 拷贝控制) 对象移动
1. 为什么要有对象移动 使用移动而非拷贝对象能够大大提升性能. 一些不能被共享的资源类的对象不能拷贝但是可以移动.eg. IO 类 unique_ptr 类 2. 如何做到对象移动 2.1 什么是右 ...
- C++ Primer 5th笔记(chap 13 拷贝控制)移动构造和移动赋值
1. 移动构造函数和移动赋值运算符 一般来说,拷贝一个资源会导致一些额外的开销.在这种拷贝并非必要的情况下,定义了移动构造函数和移动赋值运算符的类就可以避免此问题. eg. StrVec::StrVe ...
最新文章
- 《算法基础:打开算法之门》一1.5 拓展阅读
- 序列化与字符流的操作
- datetimepicker时间控件
- abap判断当前月最后一个工作日_油价正式打响第一枪!今天12月3日,今晚油价迎来大幅暴跌,调价后全国地区油价一览!...
- oracle 增长型分区,oracle 11g 分区表创建(自动按年分区)
- mockjs(接口服务代理)
- 11-散列1 电话聊天狂人 (25 分)
- 论文浅尝 | 六篇2020年知识图谱预训练论文综述
- Maxcompute造数据-方法详解
- mysql排序之order by
- 从GCN中学习的信息熵
- Excel之表格斜线一分为二后输入文字
- 有没有测身高的手机软件?这3款App和卷尺一样精准实用
- 74HC595芯片应用
- Dreamweaver——滚动字幕制作方法总结
- HDU - 3174(计算几何)
- 如何设计登录注册模块
- 学猫叫用计算机歌词,抖音学猫叫是什么歌 学猫叫歌曲歌词
- python制作浏览器 脚本之家_基于Python打造账号共享浏览器功能
- swift导入oc第三方库
热门文章
- Python 怎么样在函数内部对全局变量进行修改
- 100路监控摄像头需要使用核心交换机吗?
- 计算机审计中级培训结业考试,第二期计算机审计中级培训班结业考.doc
- 计算机网络管理考核办法,开滦医院计算机网络管理考核细则
- ML:MLOps系列讲解之《基于ML的软件的三个层次之03 Code: Deployment Pipelines》解读
- DayDayUp:互联网江湖大佬那些事(互联网大佬学历一览)
- Python语言学习之字符串那些事:python和字符串的使用方法之详细攻略
- Internet:从区块链的底层技术思考互联网是如何构成的
- Worker Service in ASP .NET Core
- 拓展编辑器(五)_监听事件