交换操作

  1. class HasPtr {
  2. friend void swap(HasPtr &rhs, HasPtr &yhs);
  3. //其他成员定义
  4. };
  5.  
  6. void swap(HasPtr &rhs, HasPtr &yhs)
  7. {
  8. using std::swap;
  9. swap(rhs.ps, yhs.ps); //交换指针,而不是string
  10. swap(rhs.i, yhs.i); //交换int成员
  11. }

在赋值运算符中使用swap

  1. // 注意rhs是按值传递的。意味着HasPtr的拷贝构造函数
  2. // 将右侧运算对象中的string拷贝到rhs
  3. HasPtr& HasPtr::operator=(HasPtr rhs)
  4. {
  5. swap(*this, rhs);
  6. return *this;
  7. }

13.3节练习

• 13.30

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. class HasPtr {
  6. friend void swap(HasPtr &rhs, HasPtr &yhs);
  7. public:
  8. HasPtr(const string &s = string()): ps(new string(s)), i() {}
  9. HasPtr(const HasPtr &rhs): ps(new string(*rhs.ps)), i(rhs.i) {}
  10. ~HasPtr();
  11.  
  12. HasPtr& operator=(const HasPtr &rhs);
  13. HasPtr& operator=(const string &rhs);
  14. string& operator*();
  15. private:
  16. string * ps;
  17. int i;
  18. };
  19.  
  20. HasPtr::~HasPtr()
  21. {
  22. delete ps;
  23. }
  24.  
  25. HasPtr& HasPtr::operator=(const HasPtr &rhs)
  26. {
  27. auto newp = new string(*rhs.ps);
  28. delete ps;
  29. ps = newp;
  30. i = rhs.i;
  31. return *this;
  32. }
  33.  
  34. HasPtr& HasPtr::operator=(const string &rhs)
  35. {
  36. *ps = rhs;
  37. return *this;
  38. }
  39.  
  40. string& HasPtr::operator*()
  41. {
  42. return *ps;
  43. }
  44.  
  45. void swap(HasPtr &rhs, HasPtr &yhs)
  46. {
  47. cout << "交换" << *rhs.ps << "和" << *yhs.ps << endl;
  48. using std::swap;
  49. swap(rhs.ps, yhs.ps);
  50. swap(rhs.i, yhs.i);
  51. }
  52.  
  53. int main()
  54. {
  55. HasPtr h("hi, mom!");
  56. HasPtr h2 = h;
  57. HasPtr h3 = h;
  58. h2 = "hi, dad!";
  59. h3 = "hi, friend";
  60. cout << "h2: " << *h2 << endl;
  61. cout << "h3: " << *h3 << endl;
  62. swap(h2, h3);
  63. cout << "h2: " << *h2 << endl;
  64. cout << "h3: " << *h3 << endl;
  65. return ;
  66. }

运行结果:

【C++ Primer 第13章】3. 交换操作的更多相关文章

  1. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  2. 第13章 GPIO-位带操作—零死角玩转STM32-F429系列

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  3. 【C++ Primer 第13章】6.对象移动

    右值引用 左值和右值 (1)两者区别: ①左值:能对表达式取地址.或具名对象/变量.一般指表达式结束后依然存在的持久对象. ②右值:不能对表达式取地址,或匿名对象.一般指表达式结束就不再存在的临时对象 ...

  4. 【C++ Primer 第13章】2. 拷贝控制和资源管理

    拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个 ...

  5. 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁

    拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...

  6. 【C++ Primer 第13章】5. 动态内存管理类

    StrVec类的设计 [题目描述]:我们将实现标准库vector类的一个简化版本,我们所做的一个简化是不使用模板,我们类只用于string,因此,它被命名为StrVec. #include<io ...

  7. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  8. C++ primer plus读书笔记——第13章 类继承

    第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...

  9. ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行

    ★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...

随机推荐

  1. .NET MVC中的ActionResult

    一  摘要 本文介绍了ASP.NET MVC中的ActionResult,本节主要介绍 EmptyResult / Content Result /JavaScriptResult /JsonResu ...

  2. CSS魔法(三)浮动、相对定位、绝对定位

    浮动 为何需要浮动? 浮动float最开始出现的意义是为了让文字环绕图片而已,但人们发现,如果想要三个块级元素并排显示,都给它们加个float来得会比较方便. 浮动问题? 为何要清除浮动? 很多情况下 ...

  3. VS新建项目工具箱图标丢失问题

    (1)在电脑里搜索*.tbd文件(2)建一个项目,把需要的工具箱图标加载上,退出 VS. (3)复制一份toolbox.tbd,重命名为toolbox_reset.tbd 然后以后新建项目就可以了.这 ...

  4. Linux 设置最大链接

    最大连接数 ulimit -SHn # 最大文件句柄数,最大打开文件数(等同最大连接数) ulimit -a # 查看 /etc/security/limits.conf # 进程最大打开文件数 # ...

  5. (原创 开源)AppWidge的使用—桌面便利贴

    Android平台的一大特色就是支持桌面插件——AppWidget. 且不说,AppWidget是否会影响系统的流畅性,AppWidget确实是满足了用户个性化和快捷操作的需要. 常见的AppWidg ...

  6. mysql 原理 ~ double write

    一 简介:今天来聊聊double write 二 细节 1 Double write 是InnoDB在 tablespace(ibdata1)上的128个页(2个区)是2MB: 2 何谓页断裂 所谓页 ...

  7. session和cookies

    Cookie 与session的产生过程                                 我们都知道HTTP协议本身是无状态的,客户只需要简单的向服务器来发送请求下载某些文件,客户端向 ...

  8. IDEA常用快捷键[转]

    原文:http://www.cnblogs.com/wxdlut/p/3410541.html 查询快捷键CTRL+N   查找类CTRL+SHIFT+N  查找文件CTRL+SHIFT+ALT+N  ...

  9. 使用Idea初始化SpringMvc项目

    (1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)

  10. 《像计算机科学家一样思考Python》-递归

    斐波那契数列 使用递归定义的最常见数学函数是 fibonacci (斐波那契数列),见其 定义 fibonacci(0) = 0 fibonacci(1) = 1 fibonacci(n) = fib ...