C++进阶--处理拷贝赋值运算符中自赋值的情况
//############################################################################
/*
* 处理拷贝赋值运算符=中自赋值的情况
*
*
* 运算符重载: 利用人们的直觉,减少学习曲线
*/
// 自赋值的情况
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++进阶--处理拷贝赋值运算符中自赋值的情况的更多相关文章
- Python中的赋值和拷贝
赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.比如: >>> a=[1,2,3] >>> b=a >>> c= ...
- python中的“赋值与深浅拷贝”
Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...
- C++ 拷贝构造函数、拷贝赋值运算符、析构函数
每一次都会忘,做个笔记吧.想到哪里写到哪里. 拷贝构造函数 第一个参数必须是自身类类型的引用,且任何额外参数都有默认值.(为什么必须是引用?见后解释) 合成拷贝构造函数:如果我们没有为一个类定义拷贝构 ...
- C++:类中的赋值函数
先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...
- 条款十七: 在operator=中检查给自己赋值的情况
在赋值运算符中要特别注意可能出现别名的情况,其理由基于两点.其中之一是效率.如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作. 另 ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- (网页)Angular.js 中 copy 赋值与 = 赋值 区别
转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...
- Scala进阶之路-Scala中的高级类型
Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...
随机推荐
- $interpolateProvider
angular.module('emailParser', []) .config(['$interpolateProvider', function($interpolateProvider) { ...
- python 中os的常用方法
1.更改当前的路径 import os os.chdir( "D:/java") 注意python中表示文件路径,文件夹之间用/或者\\不能使用\
- PAT-L2-006(根据后序中序遍历建立树)
#include <bits/stdc++.h> using namespace std; ; queue <int> q; int a[N]; int b[N]; int n ...
- 51Nod 1084:矩阵取数问题 V2(多维DP)
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励 ...
- 【HDOJ1598】【枚举+最小生成树】
http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/1000 ...
- Apache Kafka 源码剖析
Getting Start 下载 http://kafka.apache.org/ 优点和应用场景 Kafka消息驱动,符合发布-订阅模式,优点和应用范围都共通 发布-订阅模式优点 解耦合 : 两个应 ...
- js语言中的新发现和一些总结
js中定义变量加var和不加var的区别 原创 2016年09月01日 10:17:33 标签: js 3658 这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清 ...
- DevExpress控件使用方法:第一篇 gridControl详解
GridControl (1)层次设计器 有五种视图模式,banded gridview多行表头,数据还是一行一组,最靠近数据的表头与数据一一对应:advanced banded gridview多行 ...
- css动画和js动画的差异
代码复杂度,js 动画代码相对复杂一些 动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css动画不能添加事件 动画性能看,js 动画多了一个js 解析的过程,性能不如 css 动 ...
- 深入详解美团点评CAT跨语言服务监控(八)报表持久化
周期结束 我们从消息分发章节知道,RealtimeConsumer在初始化的时候,会启动一个线程,每隔1秒钟就去从判断是否需要开启或结束一个周期(Period),如下源码,如果 value < ...