//############################################################################
/*
* 处理拷贝赋值运算符=中自赋值的情况
*
*
* 运算符重载: 利用人们的直觉,减少学习曲线
*/
// 自赋值的情况
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. Mariadb使用xtrabackup工具备份数据脚本

    #!/bin/bash#这个脚本用来备份SQL文件: sql_home="/home/mysql"sql_bak_log="$sql_home/xtrabackup.lo ...

  2. HPU第四次积分赛-K :方框(水题,打印图形)

    方框 描述 用'*'打印出一个nxn的字符图形(1<=n<=100). 输入 多组输入.每行输入一个n,输入EOF结束文件. 输出 输出一个满足题意的图形. 输入样例 1  1 2 5 6 ...

  3. HDU 1873 看病要排队 优先队列

    Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. spring管理

    spring管理 SqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...

  5. acm 2084

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...

  6. php基础-6

    类的继承和方法重写 <?php class people{ public function __construct($name, $age, $sex) { $this->age = $a ...

  7. Python知识点整理,基础3 - 字典操作

  8. 【BZOJ4554】【TJOI2016】【HEOI2016】游戏

    我好弱啊quq 原题: 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  9. 【shell编程】之基础知识了解shell

    一.什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了 ...

  10. torchvision库简介(翻译)

    部分跟新于:4.24日    torchvision 0.2.2.post3 torchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详细介绍在:http ...