//############################################################################
/*
* 处理拷贝赋值运算符=中自赋值的情况
*
*
* 运算符重载: 利用人们的直觉,减少学习曲线
*/
// 自赋值的情况
dog dd;
dd = dd; // 看起来很傻 dogs[i] = dogs[j]; // 看起来不怎么傻 /* 实现赋值运算符 */
class collar;
class dog {
collar* pCollar;
dog& operator=(const dog& rhs) {
if (this == &rhs)
return *this; collar* pOrigCollar = pCollar;
pCollar = new collar(*rhs.pCollar); //可能会失败,保证异常安全
delete pOrigCollar;
return *this;
}
} /* 实现 2: 委托 */
class dog {
collar* pCollar;
dog& operator=(const dog& rhs) {
*pCollar = *rhs.pCollar; // 逐成员拷贝collar,或者调用collar的拷贝赋值运算符=
return *this;
}
} /* 实现 3:copy and swap
-- C++中析构函数和swap时强异常安全的
拷贝构造生成一个临时对象,然后跟本对象swap
异常安全,且天然解决了自赋值问题
注意swap的可见性问题
*/
class dog {
collar* pCollar;
dog& operator=(const dog& rhs) {
dog tmp_dog(rhs);
this->swap(tmp_dog);
return *this;
}
}
//成员函数的方式
void dog::swap(dog& rhs) {
using std::swap;
//swap(this->pCollar, rhs->pCollar);
this->pCollar->swap(rhs->pCollar); } //非成员函数的方式 模板全特化
namespace std {
template<>
void swap<dog> (dog& lhs, dog& rhs)
{
lhs.swap(b);
}
}

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. c# 休眠后 定时唤醒

    源码见附件,执行唤醒功能前需要先对电源进行设置如下图: 源码

  2. BZOJ-5244 最大真因数(min25筛)

    题意:一个数的真因数指不包括其本身的所有因数,给定L,R,求这个区间的所有数的最大真因数之和. 思路:min25筛可以求出所有最小因子为p的数的个数,有可以求出最小因子为p的所有数之和. 那么此题就是 ...

  3. vs2015连接mysql进行数据库操作

    要求:电脑提前安装好vs,mysql. 1.在需要连接mysql的项目上右键选择“属性” -> “C/C++” -> “常规” ->选择“附加包含目录” 在弹出窗口中添加mysql的 ...

  4. jqGrid 加载完jqGrid之后可以执行函数的方法

    , gridComplete: function() { jQuery('#first_gridpager').html("首页 "); jQuery('#prev_gridpag ...

  5. &,~,|,^

    与.或.异或的运算   与运算 (“  & ”) 参与运算的两个数据,按照二进制位进行“与运算”.运算规则:0&0=0;   0&1=0;   1&0=0;    1& ...

  6. hdu4990 Reading comprehension 矩阵快速幂

    Read the program below carefully then answer the question.#pragma comment(linker, "/STACK:10240 ...

  7. powerdesigner基本使用

    parent sonPK主键 FK外键 n ------> 1 alter table muniubox.cpa_accounting_book add constraint FK_Refere ...

  8. js判断是否是闰年

    JavaScript判断值是否是闰年: 判断是否闰年公式:(year%4==0 && year%100 !=0) ||(year%400 ==0) var year = prompt( ...

  9. 【JVM】java对象

    一.对象内存布局 对象在内存中存储可分为3块区域:对象头,实例数据,对齐填充 1.对象头 对象头包含两部分内容. 第一部分:存储对象自身的运行时数据,哈希吗(hashCode),GC分代年龄,锁状态标 ...

  10. nginx-port-Permission-denied

    nginx use 9000 port Permission denied  other port ok 新架构下web服务需要使用反向代理,将不同的请求转发到不同的service,对应不同的端口. ...