1. //############################################################################
  2. /*
  3. * 处理拷贝赋值运算符=中自赋值的情况
  4. *
  5. *
  6. * 运算符重载: 利用人们的直觉,减少学习曲线
  7. */
  8. // 自赋值的情况
  9. dog dd;
  10. dd = dd; // 看起来很傻
  11. dogs[i] = dogs[j]; // 看起来不怎么傻
  12. /* 实现赋值运算符 */
  13. class collar;
  14. class dog {
  15. collar* pCollar;
  16. dog& operator=(const dog& rhs) {
  17. if (this == &rhs)
  18. return *this;
  19. collar* pOrigCollar = pCollar;
  20. pCollar = new collar(*rhs.pCollar); //可能会失败,保证异常安全
  21. delete pOrigCollar;
  22. return *this;
  23. }
  24. }
  25. /* 实现 2: 委托 */
  26. class dog {
  27. collar* pCollar;
  28. dog& operator=(const dog& rhs) {
  29. *pCollar = *rhs.pCollar; // 逐成员拷贝collar,或者调用collar的拷贝赋值运算符=
  30. return *this;
  31. }
  32. }
  33. /* 实现 3:copy and swap
  34. -- C++中析构函数和swap时强异常安全的
  35. 拷贝构造生成一个临时对象,然后跟本对象swap
  36. 异常安全,且天然解决了自赋值问题
  37. 注意swap的可见性问题
  38. */
  39. class dog {
  40. collar* pCollar;
  41. dog& operator=(const dog& rhs) {
  42. dog tmp_dog(rhs);
  43. this->swap(tmp_dog);
  44. return *this;
  45. }
  46. }
  47. //成员函数的方式
  48. void dog::swap(dog& rhs) {
  49. using std::swap;
  50. //swap(this->pCollar, rhs->pCollar);
  51. this->pCollar->swap(rhs->pCollar);
  52. }
  53. //非成员函数的方式 模板全特化
  54. namespace std {
  55. template<>
  56. void swap<dog> (dog& lhs, dog& rhs)
  57. {
  58. lhs.swap(b);
  59. }
  60. }

C++进阶--处理拷贝赋值运算符中自赋值的情况的更多相关文章

  1. Python中的赋值和拷贝

    赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.比如: >>> a=[1,2,3] >>> b=a >>> c= ...

  2. python中的“赋值与深浅拷贝”

    Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...

  3. C++ 拷贝构造函数、拷贝赋值运算符、析构函数

    每一次都会忘,做个笔记吧.想到哪里写到哪里. 拷贝构造函数 第一个参数必须是自身类类型的引用,且任何额外参数都有默认值.(为什么必须是引用?见后解释) 合成拷贝构造函数:如果我们没有为一个类定义拷贝构 ...

  4. C++:类中的赋值函数

    先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...

  5. 条款十七: 在operator=中检查给自己赋值的情况

    在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点.其中之一是效率.如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作. 另 ...

  6. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  7. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

  8. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  9. Scala进阶之路-Scala中的高级类型

    Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...

随机推荐

  1. 小白入门photoscan

    1.安装 我装的是photoscanPro 1.4.5版本.[注]:刚开始是在官网上下载的,要收费就点了试用,结果当我等了一天把将近200张图片处理完后,告诉我试用版不能保存文件...(绝望-_- - ...

  2. HPU第四次积分赛-L:A Winged Steed(完全背包)

    A Winged Steed 描述 有n种千里马,每一种都有若干匹,第i种马的颜值ai​,价格di​.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾Ai​.现在 ...

  3. HDU 1087:Super Jumping! Jumping! Jumping!(LIS)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. centos7.0之vsftpd随笔

    yum install vsftpd -f安装vsftpd软件 systemctl start vsftpd 默认ftp目录为/var/ftp/,该文件夹下有pub文件夹 iptables -F 防火 ...

  5. hasura graphql-engine v1.0.0-alpha30 版本新功能介绍

    hasura graphql-engine v1.0.0-alpha30 发布了,以下为一些变动的简单说明 破坏性的变动 order_by 中的desc 从 desc nulls last 修改为 d ...

  6. NonAction与ChildActionOnly

    NonAction 表示它不是一个真正的Action,而是一个普通方法: ChildActionOnly 表示它只能在View中通过Html.Action或Html.RenderAction来使用

  7. Python 读写

    读:read(), read(size), readlines() 写:write() 关闭 close() StingIO, BytesIO() 读文本文件 read() f = open('D:/ ...

  8. day28 1.缓冲区 2.subprocess 3.黏包现象 4.黏包现象解决方案 5.struct

    1.缓冲区: 输入缓冲区  输出缓冲区 2. subprocess的使用import subprocess sub_obj = subprocess.Popen('ls', #系统指令shell=Tr ...

  9. junit 测试quartz

    Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自然也无法执行,JunitCore代码如下: ...

  10. bzoj 4660 Crazy Rabbit——LIS解决“相交”限制的思想

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4660 想到一个点可以用它与圆的两个切点表示.并想到可以把切点极角排序,那么就变成环上的一些区 ...