安全性良好的operator=操作,和新的new方法(针对深度复制的情况)
class B
{
};
class A
{
public:
A& operator=(const A& a)
{
B* temp = b; //这里解决重复赋值的方法是用temp指向自己,如果一样,下面的 delete会删掉
b = new B(*a.b);//关键复制,就是把b=new B;b=a.b;分开写
delete temp; //删掉过去的自己,delete 尽量后面写,万一delete后有抛出异常这些什么就很尴尬
return *this; //上面那句delete一定是new的
}
B* b; }; int main()
{
int a = 3;
int *b = &a;
int *c = new int(*b);//新的new 方法,两条语句合在一起写
int *d = new int;//和上面的同一个意思
d = b;
int *e = new int(a);//和上面的一个意思
int *f = new int(3);//和上面的一个意思
cout << *b << endl << *c << endl << *d << endl << *e;
}
还有一种copy and swap的方法
private:
int a;
void swapp(A& x)//在自己特有的swap上调用标准的swap
{
swap(x.a, a);
//swap(其他数据)
}
public:
A(int x) :a(x){}
A& operator=( A x)
{
swapp(x);
return *this;
}
这个是我用过的旧版本
class A
{
int a;
public:
A(int x) :a(x){}
template<typename T >//使用自己特例化的swap
void swap(T& a)
{
int itemp = this->a;
this->a = a.a;
a.a = itemp;
}
A& operator=(A x)//和下面的一样,少了传值复制这个步骤,代码更加整洁,建议用这个
{
swap(x);//原来有的数据会被当作临时数据而delete掉
return *this;
}
A& operator=(const A& x)
{
A temp = x;
swap( temp);
return *this;
}
void display()
{
cout << a << endl;
}
};
int main()
{
A a(3), b(1);
A c(a);
b = a;//测试赋值
a = a;//测试自我赋值
a.display();
b.display();
c.display();
}
以前没有特例化swap函数而导致无限重复调用的失败例子
swap(temp, *this);
我貌似知道为什么不行了
swap里面有temp=*this之类的语句
就会调用operator=的函数然后无限重复
所以要用自己特例化的swap
void swapp(T a, T b) //和下面重复调用
{
T temp = a;
a = b;
b = temp;
} class A
{
int a;
public:
A(int x) :a(x){}
A& operator=( A x) //和上面重复调用
{
swapp(*this,x);
return *this;
}
安全性良好的operator=操作,和新的new方法(针对深度复制的情况)的更多相关文章
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
- python操作日期和时间的方法
不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...
- JS子父窗口互相操作取值赋值的方法介绍
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
- 多人操作sqlite3数据库冲突问题解决方法
问题描述:sqlite3数据放置在某一台电脑的某个共享文件夹下,操作数据库的应用程序安装在同一局域网下的很多台电脑上,由于存在多人同时使用该应用程序,所以存在多人同时操作数据库的情况.经过测试发现,最 ...
- .net(C#)操作文件的几种方法汇总
.net(C#)操作文件的几种方法汇总 System.IO命名空间下类的用法:在System.IO名称空间中包含了用于文件输入输出的主要类.File:实用类,提供许多静态方法,用于移动.复制和删除文件 ...
- Selenium 新窗口处理方法
有时点击一个链接,跳到一个新的窗口,这时WebDriver需切换到新窗口,才能对新窗口的元素进行操作 这里封装一个switchToWindow方法: public boolean switchToWi ...
- java8在Collection中新增加的方法removeIf
记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题.问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方 ...
- Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 9.2 估计功能 eviews9.0下载链接: ...
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
随机推荐
- js 音乐
define(function(require,exports,module){ var $music = document.getElementById('music'); var $music_m ...
- centos 开启apache rewrite模式
mod_rewrite能使网页伪静态,对于搜索引擎友好,下面就是开启这个功能的说明!启用mod_rewrite模块在conf目录的httpd.conf文件中找到 LoadModule rewrite_ ...
- Android开发者须知的几种APP加密方式--备
作为一个Android开发者,不仅需要使自己的APP功能丰富,便于使用,同时也需要去完善APP的安全性,下面就介绍几种简单而又可靠的加密方法.1.Spongy Castle Spongy Castle ...
- cf B. Fox Dividing Cheese
http://codeforces.com/contest/371/problem/B #include <cstdio> #include <iostream> #inclu ...
- java中enum类型的使用
java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我 ...
- Android系统的进程分类
1.前台进程:即当前正在前台运行的进程,说明用户当前正在与通过该进程与系统进行交互,所以该进程为最重要的进程,除非系统的内容已经到不堪重负的情况,否则系统是不会将改进程终止的.2.可见进程:一般还是显 ...
- java IO和NIO的场景选择
就使用上来说,传统的面向流的IO更简单,而面向缓冲(块)的NIO更复杂,因为可调整空间大,接口的概念性也更加低层(原生)些. 下面说说使用场景: IO的场景: 1.文件可能很多,但是size并不是那么 ...
- 使用Userlock监控用户访问 增强学校网络安全
随着网络技术的不断进步,一方面,拥有广泛教学资源的各大大中院校纷纷升级校园网络技术,保护学校的网络安全.另一方面,网络安全面临的威胁也层出不穷.面对来自网络内外的安全威胁,负责中小学.大学院校网络安全 ...
- HDU_1009——老鼠的交易,性价比排序,最大化收益
Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...
- HDU5196--DZY Loves Inversions 树状数组 逆序数
题意查询给定[L, R]区间内 逆序对数 ==k的子区间的个数. 我们只需要求出 子区间小于等于k的个数和小于等于k-1的个数,然后相减就得出答案了. 对于i(1≤i≤n),我们计算ri表示[i,ri ...