【C++ Primer 第13章】3. 交换操作
交换操作
- class HasPtr {
- friend void swap(HasPtr &rhs, HasPtr &yhs);
- //其他成员定义
- };
- void swap(HasPtr &rhs, HasPtr &yhs)
- {
- using std::swap;
- swap(rhs.ps, yhs.ps); //交换指针,而不是string
- swap(rhs.i, yhs.i); //交换int成员
- }
• 在赋值运算符中使用swap
- // 注意rhs是按值传递的。意味着HasPtr的拷贝构造函数
- // 将右侧运算对象中的string拷贝到rhs
- HasPtr& HasPtr::operator=(HasPtr rhs)
- {
- swap(*this, rhs);
- return *this;
- }
13.3节练习
• 13.30
- #include<iostream>
- #include<string>
- using namespace std;
- class HasPtr {
- friend void swap(HasPtr &rhs, HasPtr &yhs);
- public:
- HasPtr(const string &s = string()): ps(new string(s)), i() {}
- HasPtr(const HasPtr &rhs): ps(new string(*rhs.ps)), i(rhs.i) {}
- ~HasPtr();
- HasPtr& operator=(const HasPtr &rhs);
- HasPtr& operator=(const string &rhs);
- string& operator*();
- private:
- string * ps;
- int i;
- };
- HasPtr::~HasPtr()
- {
- delete ps;
- }
- HasPtr& HasPtr::operator=(const HasPtr &rhs)
- {
- auto newp = new string(*rhs.ps);
- delete ps;
- ps = newp;
- i = rhs.i;
- return *this;
- }
- HasPtr& HasPtr::operator=(const string &rhs)
- {
- *ps = rhs;
- return *this;
- }
- string& HasPtr::operator*()
- {
- return *ps;
- }
- void swap(HasPtr &rhs, HasPtr &yhs)
- {
- cout << "交换" << *rhs.ps << "和" << *yhs.ps << endl;
- using std::swap;
- swap(rhs.ps, yhs.ps);
- swap(rhs.i, yhs.i);
- }
- int main()
- {
- HasPtr h("hi, mom!");
- HasPtr h2 = h;
- HasPtr h3 = h;
- h2 = "hi, dad!";
- h3 = "hi, friend";
- cout << "h2: " << *h2 << endl;
- cout << "h3: " << *h3 << endl;
- swap(h2, h3);
- cout << "h2: " << *h2 << endl;
- cout << "h3: " << *h3 << endl;
- return ;
- }
运行结果:
【C++ Primer 第13章】3. 交换操作的更多相关文章
- [C++ Primer] : 第13章: 拷贝控制
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...
- 第13章 GPIO-位带操作—零死角玩转STM32-F429系列
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 【C++ Primer 第13章】6.对象移动
右值引用 左值和右值 (1)两者区别: ①左值:能对表达式取地址.或具名对象/变量.一般指表达式结束后依然存在的持久对象. ②右值:不能对表达式取地址,或匿名对象.一般指表达式结束就不再存在的临时对象 ...
- 【C++ Primer 第13章】2. 拷贝控制和资源管理
拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个 ...
- 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁
拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...
- 【C++ Primer 第13章】5. 动态内存管理类
StrVec类的设计 [题目描述]:我们将实现标准库vector类的一个简化版本,我们所做的一个简化是不使用模板,我们类只用于string,因此,它被命名为StrVec. #include<io ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- C++ primer plus读书笔记——第13章 类继承
第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
随机推荐
- .NET MVC中的ActionResult
一 摘要 本文介绍了ASP.NET MVC中的ActionResult,本节主要介绍 EmptyResult / Content Result /JavaScriptResult /JsonResu ...
- CSS魔法(三)浮动、相对定位、绝对定位
浮动 为何需要浮动? 浮动float最开始出现的意义是为了让文字环绕图片而已,但人们发现,如果想要三个块级元素并排显示,都给它们加个float来得会比较方便. 浮动问题? 为何要清除浮动? 很多情况下 ...
- VS新建项目工具箱图标丢失问题
(1)在电脑里搜索*.tbd文件(2)建一个项目,把需要的工具箱图标加载上,退出 VS. (3)复制一份toolbox.tbd,重命名为toolbox_reset.tbd 然后以后新建项目就可以了.这 ...
- Linux 设置最大链接
最大连接数 ulimit -SHn # 最大文件句柄数,最大打开文件数(等同最大连接数) ulimit -a # 查看 /etc/security/limits.conf # 进程最大打开文件数 # ...
- (原创 开源)AppWidge的使用—桌面便利贴
Android平台的一大特色就是支持桌面插件——AppWidget. 且不说,AppWidget是否会影响系统的流畅性,AppWidget确实是满足了用户个性化和快捷操作的需要. 常见的AppWidg ...
- mysql 原理 ~ double write
一 简介:今天来聊聊double write 二 细节 1 Double write 是InnoDB在 tablespace(ibdata1)上的128个页(2个区)是2MB: 2 何谓页断裂 所谓页 ...
- session和cookies
Cookie 与session的产生过程 我们都知道HTTP协议本身是无状态的,客户只需要简单的向服务器来发送请求下载某些文件,客户端向 ...
- IDEA常用快捷键[转]
原文:http://www.cnblogs.com/wxdlut/p/3410541.html 查询快捷键CTRL+N 查找类CTRL+SHIFT+N 查找文件CTRL+SHIFT+ALT+N ...
- 使用Idea初始化SpringMvc项目
(1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)
- 《像计算机科学家一样思考Python》-递归
斐波那契数列 使用递归定义的最常见数学函数是 fibonacci (斐波那契数列),见其 定义 fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fib ...