//############################################################################
/*
* 处理拷贝赋值运算符=中自赋值的情况
*
*
* 运算符重载: 利用人们的直觉,减少学习曲线
*/
// 自赋值的情况
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. Java中的Arrays类使用详解

    首先先创建一个打印数组的方法,方便后面直接使用 public static void output(int []a) { for(int i=0;i<a.length;i++) { System ...

  2. Vue的新启之笔

    之前就有接触Vue这一语言,作为一个摊薄饼的我,觉得其基础性的知识体系与其他语言是相通的.且由于贵阳这一城市的地理位置的特殊性,我不得不承认想要从事软件开发这一行业,不精通一门语言不行.因为,任何一家 ...

  3. Linux安装模式AppImage,Flatpak,Snap整理

    本文只谈Linux世界用户较多的前2大主要分支, RedHat Red Hat Enterprise Linux 简称RHEL rpm (RedHat, CentOS, Fedora, Oracle. ...

  4. C++ 作业 (循环链表构建队列)

    /* author screen name Andromeda_Galaxy; chinese name 杨子俊 */ #include<bits/stdc++.h> using name ...

  5. HTML中嵌套的子frame如何访问父页面中的函数?

    我解决的办法,在父页面写了个函数,然后在frame页面调用父页面的函数,具体代码如下: 父:function a(){} 子frame:window.parent.a(); 问题迎刃而解 https: ...

  6. 在java中(==)的用法

  7. idea使用的JDK版本1.9换成1.8后相关的更改设置

    File——>Project Structure 一.查看Project中的jdk 1.检查Project SDK:中jdk 版本是否为1.8版本 2.检查Project language le ...

  8. What are User and Group Permissions

    https://www.linode.com/docs/tools-reference/linux-users-and-groups/ What are User and Group Permissi ...

  9. 自定义简单的模板引擎-JS模板引擎

    http://www.cnblogs.com/52fhy/p/5393673.html

  10. oracle-sql分析练习

    http://blog.chinaunix.net/uid-13552913-id-3028644.html Oracle 修改字段顺序的两种方法 一 如果要修改字段顺序,一般情况可以使用以下步骤: ...